我有一个问题,即具有隔离范围的指令未通过绑定到其 parent.parent 范围进行更改。
总之,我希望对绑定到父属性的指令隔离范围中的属性所做的更改会一直传播到该属性的父范围(该属性是从 parent.parent 范围继承的) ,但事实并非如此。它仅更改直接父范围的值,而 parent.parent 范围具有旧值。更糟糕的是,对 parent.parent 范围属性的任何更改都不再渗透到隔离范围或其直接父级。我知道这是构建 Angular 范围的 Javascript 原型继承的正常行为,但在这种双向数据绑定的情况下不需要它,我正在寻找 Angular 中的解决方案。
以下是行为示例:http: //jsfiddle.net/abeall/RmDuw/344/
我的 HTML 包含一个控制器 div ( MyController1
),其中是另一个控制器 div ( MyController2
),其中是一个指令 ( MyDirective
):
<div ng-controller="MyController">
<p>MyController1: {{myMessage}} <button ng-click="change()">change</button></p>
<div ng-controller="MyController2">
<p>MyController2: {{myMessage}} <button ng-click="change()">change</button></p>
<p>MyDirective: <my-directive message="myMessage"/></p>
</div>
</div>
JavascriptmyMessage
在外部MyController
作用域上定义,内部MyController2
作用域继承并绑定myMessage
到message
指令上,并且MyDirective
定义message
为隔离作用域属性。在每个级别change()
都定义了一个函数来更改本地消息属性:
var app = angular.module('myApp', []);
function MyController($scope) {
var count = 0;
$scope.myMessage = "from controller";
$scope.change = function(){
$scope.myMessage = "from controller one " + (++count);
}
}
function MyController2($scope) {
var count = 0;
$scope.change = function(){
$scope.myMessage = "from controller two " + (++count);
}
}
app.directive('myDirective', function() {
return {
restrict: 'E',
replace: true,
template: '<span>Hello {{message}} <button ng-click="change()">change</button></span>',
scope: {
message: "="
},
link: function(scope, elm, attrs) {
var count = 0;
scope.change = function(){
scope.message = "from directive " + (++count);
}
}
};
});
你会注意到的是:
如果您单击
MyController1
几次更改按钮,所有级别都会更新(它会向下继承)。如果您随后单击
MyDirective
' 更改按钮,它会更新MyController2
(向上绑定)但不会MyController1
以任何方式更改。在此之后,单击
MyController1
的更改按钮不再向下渗透到MyController2
范围MyDirective
,反之亦然。现在两人已经分开了。这就是问题。
所以我的问题是:
Angular 是否有办法允许范围属性的绑定或继承(
myMessage
在这种情况下)一直沿父范围涓涓细流?如果不是,我应该以什么方式将指令的隔离范围中的更改同步到 parent.parent 控制器范围的属性?该指令无法了解其父项的结构。