2014-09-04 63 views
0

我想將控制器中定義的功能公開給子控制器。本質上是這樣的:解決控制器?

.state('parent', { 
    controller: 'ParentCtrl', 
}) 

.state('parent.child', { 
    controller: 'ChildCtrl', // how to inject ParentCtrl? 
}) 

當然,這是不可用的。那麼如何解決?讓我們嘗試:

.state('parent', { 
    resolve: { 
    ParentCtrl: 'ParentCtrl', 
    } 
}) 

.state('parent.child', { 
    resolve: { 
    ChildCtrl: 'ChildCtrl', // just declare ParentCtrl as injected dependency 
    } 
}) 

這是不行的,不過,如果ParentCtrl或ChildCtrl與angular.controller聲明角控制器:

http://plnkr.co/edit/ggHkZTkQJSsL24sm7X2V

所以,如果我們讓他們的服務是什麼?

http://plnkr.co/edit/Sl1qxWcub6bvXZfPEvHE

嘿,這工作!但是如果我想將已解決的依賴注入到它呢?那麼,這是行不通的。只有一個服務的實例可以同時存在,無論如何,和解析的依賴不在範圍內爲其創造:

http://plnkr.co/edit/gsvJlJSpx2WEB1s6l7NU

這是不幸的UI路由器不會解決控制器。看來唯一的解決方案是用一個解決依賴定義我的控制器爲angular.constant,然後將其注入到我的模塊的config,然後構造一個控制器:

http://plnkr.co/edit/8gGKNxjpv2OgS0obNvVi

有沒有更好的選擇?

回答

0

您實際上可以注入$controller服務並在解析期間返回控制器的實例。原因是你不能直接注入控制器。

例子: -

ParentCtrl: function($controller){ 
    return $controller('ParentCtrl'); 
    } 

Demo

但如果這是一個很常用的功能,那麼他們也許應該駐留在服務。還有一件事是使用Controller As語法,你仍然可以在具有別名的子控制器中訪問它們。有一個很好的解釋about it here

+0

你的演示不會像我想在我的最後一個例子中那樣向控制器注入'dep',但'$ controller'服務就是我正在尋找的。我能夠得到[更接近我想要的東西](http://plnkr.co/edit/IXkONlZDW7xH4kfdAjus)。它是無關的,但我知道'controllerAs'會讓我從子內部訪問父控制器,如果我要注入'$ scope',我試圖避免,因爲在文章中提到的同樣的原因鏈接。 – 2014-09-05 04:19:14

+0

@JohnFreeman Ofcourse您可以使用'$ controller'構造函數注入任何依賴項(這真的很常見),但是在您的問題中沒有提到。其實我讀一下你的問題有點困惑。 – PSL 2014-09-05 11:15:23