考虑两个带隔离范围的嵌套指令:
<dctv1>
<dctv2></dctv2>
<dctv1>
如果我希望dctv2
与dctv1
交谈,我可以选择:
dctv1
dctv2
定义中require:'^dctv1'
的控制器
<dctv2 callParent="hello()"></dctv2>
和scope:{callParent:'&'}
$scope.$emit
中使用dctv2
,但之后所有的父作用域都会听到此消息。 现在我希望dctv1
与dctv2
交谈。
$scope.$broadcast
,但所有孩子都会听到。通过谈到这里,我的意思是称为函数或类似函数。不想设置堵塞digestloop的手表。
如何让dctv1
以最佳方式通知dctv2
,让它们松散耦合?我应该能够毫无错误地删除dctv2。
答案 0 :(得分:3)
看看AngularJS NgModelController的一些想法。
每个<dctv2>
指令都需要<dvtv1>
才能注入控制器。然后,您可以将对象或回调添加到该控制器的属性,并在销毁<dctv2>
时将其删除。
<dvtv1>
不会直接与孩子交谈,但会触发与其属性绑定的回调。
例如;
NgModelController
有$parsers
和$formatters
,它们是函数回调数组。您将自己的函数推送到数组中以扩展控制器的行为。
当NgModelController
执行输入验证时,它基本上通过这些属性与其他指令对话。
答案 1 :(得分:0)
我建议使用angular services。这样,您就可以将行为分离为一个或多个服务。
答案 2 :(得分:0)
一种方法是建立一个与您想要的控制器通信的服务/工厂。
例如,这是一个getter / setter Factory
.factory('factoryName', function () {
var something = "Hello";
return {
get: function () {
return something;
},
set: function (keyword) {
something = keyword;
return something ;
}
};
}])
然后在你的控制器中:
.controller('controllerOne', ['factoryName', function (factoryName) {
$scope.test = factoryName.get();
}]);
.controller('controllerTwo', ['factoryName', function (factoryName) {
$scope.test = factoryName.get();
$scope.clickThis = function (keyword) {
factoryName.set(keyword);
};
}]);
答案 3 :(得分:-1)
您可以使用每个必须传递给父级的子级的ID来管理它;父母将使用该id广播事件:只有从父母传递的id是他自己的id时,孩子才会执行操作。
再见