Gus*_*tav 4 angularjs angularjs-directive angularjs-controller
我有(以下)html:
<div ng-controller="MyController">
<my-sub-directive></my-sub-directive>
</div>
Run Code Online (Sandbox Code Playgroud)
控制器的外观并不重要:
app.controller("MyController", function($scope) {
$scope.foo = "bar";
})
Run Code Online (Sandbox Code Playgroud)
我的指令看起来像这样:
function mySubDirective() {
return {
restrict: "E",
templateUrl:"aTemplate.html",
require: "^MyController",
link: function($scope, element) {
}
};
}
app.directive("mySubDirective", mySubDirective);
Run Code Online (Sandbox Code Playgroud)
在文档中,他们总是在require-property中指定另一个指令,但它表示这意味着你需要控制器.所以我想尝试这个解决方案.但是我得到了错误
"无法找到指令'mySubDirective'所需的控制器'MyController'".
如果由ng-controller设置,是否不能要求指令中的控制器?
你只能这样做:
require: "^ngController"
Run Code Online (Sandbox Code Playgroud)
所以,你不能比那更具体,即你不能要求"MainCtrl"或"MyController"通过名称,但它会得到控制器实例:
.controller("SomeController", function(){
this.doSomething = function(){
//
};
})
.directive("foo", function(){
return {
require: "?^ngController",
link: function(scope, element, attrs, ctrl){
if (ctrl && ctrl.doSomething){
ctrl.doSomething();
}
}
}
});
Run Code Online (Sandbox Code Playgroud)
<div ng-controller="SomeController">
<foo></foo>
</div>
Run Code Online (Sandbox Code Playgroud)
我不认为,虽然,这是一个很好的方法,因为它使指令非常依赖于地方使用它.您可以按照注释中的建议直接传递控制器实例 - 它使它更明确一些:
<div ng-controller="SomeController as ctrl">
<foo ctrl="ctrl"></foo>
</div>
Run Code Online (Sandbox Code Playgroud)
但它仍然是一个过于通用的对象,很容易被指令的用户误用.
相反,公开一个定义良好的API(通过属性)并将引用传递给控制器中定义的函数/属性:
<div ng-controller="SomeController as ctrl">
<foo do="ctrl.doSomething()"></foo>
</div>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1714 次 |
| 最近记录: |