我有这段代码:
JS:
angular.module("module")
.controller("fooController", ["$scope", function($scope) {
...
})
.directive("foo", function() {
return {
restrict: "E",
controller: "fooController",
link: function($scope, $element, $attrs) {
// Do some things with the scope of the controller here
}
}
})
.directive("bar", function() {
return {
restrict: "E",
require: "fooController",
link: function($scope, $element, $attrs) {
// Nothing yet
}
}
});
HTML:
<html>
<head>
<!-- Scripts here -->
</head>
<body ng-app="module">
<foo/>
<bar/>
</body>
</html>
指令foo
有效,但指令bar
会引发错误:No controller: fooController
。
如何在保持当前结构的同时修复此问题(控制器不在HTML内部,但由指令使用,bar
在foo
之外并共享同一个控制器,而两者都是修改其范围)?我阅读了讨论here,但我不明白该怎么做。
答案 0 :(得分:5)
由于您的最终目标是在控制器之间进行通信,因此您无需在多个指令中重复使用相同的控制器(我怀疑重新使用是否允许您进行通信)。无论如何,最好的方法是使用服务。
文章Can one controller call another?详细说明了这一点,但简单来说,首先要创建一个服务:
app.factory('myService', function () {
var data;
return {
getData: function () {
return data
},
setData: function (newData) {
data = newData;
}
};
});
然后,您可以在控制器中使用此服务,并使用该服务的setData()
和getData()
功能与每个控制器进行通信。
答案 1 :(得分:4)
您不能要求控制器。您可以要求一个指令,该指令是当前指令的父节点之一。
<foo>
<bar />
</foo>
// in foo
controller: 'fooController'
// in bar
require: '^foo' // ^ means to search it up in the tree
这里bar可以要求foo,它将拥有foo的控制器:http://jsfiddle.net/Zmetser/kHdVX/ 在这个例子中,fooController将被初始化一次。
<foo />
<bar />
// in foo
controller: 'fooController'
// in bar
controller: 'fooController'
这里bar和foo有fooController的实例:http://jsfiddle.net/Zmetser/QypXn/