如果您愿意在共同祖先中创建一个模型作为带有$watch目标的交换机,那么您可以使用预先存在的设施来使每个指令突变和/或监视该交换机模型。组件的访问模式和内容控制器对于每个范围具有两个非常不同的调用签名,并且在传递的情况下存在轻微的“陷阱”。
具有双向绑定的隔离作用域
在注册指令的隔离作用域时,“=attrName”将导致检查名为“attrName”的domainName属性。Angular将设置双向绑定,以便对任一范围中的模型值进行更改也会影响兄弟范围中的模型。
示例
在controller-parent.js中:
module.controller( 'ParentController', function() {
$scope.switchboard = { };
}
在 directive-sg-dialogue.js 中
return {
scope: {
isolatedPeer: "=dialogModel"
};
...在指令元数据中...
<div ng-controller="ParentController">
<sg-dialog dialog-model="switchboard">
<div ng-controller="ChildController"></div>
</sg-dialog>
</div>
...在某些应用程序视图模板中,以及...
$scope.switchboard = { isApplied: false }
...在绑定到应用程序视图模板的控制器中...
然后您就可以开始了...
$scope.$watch( 'switchboard.isApplied', function(newValue, oldValue) { })
...在共同祖先中查找,并在之后获取回调...
isolatedPeer.isApplied = true
...在隔离作用域中。
原型继承
只要您不明确设置$ scope.swtichboard在被转换的子级中,您就可以从转换的子级中的angular表达式访问“switchboard.isApplied”,并使插值引擎“查找”父控制器在其自己的作用域中分配和存储的值。
例如,每当对话框关闭时,将调用以下回调:
$scope.$watch( 'switchboard.isApplied', function(newValue, oldValue) { } );
这是因为被转入的子元素总是被赋予基本作用域,而不是隔离作用域。
希望这对您有所帮助!