分離スコープを持つディレクティブが、parent.parent スコープへのバインディングを介して変更を加えていないという問題があります。
要約すると、親プロパティにバインドされているディレクティブのisolateスコープ内のプロパティに加えられた変更は、そのプロパティの親スコープ全体に伝播することを期待しています(プロパティは最初にparent.parentスコープから継承されました) 、しかしそうではありません。直接の親スコープの値のみを変更しますが、parent.parent スコープには古い値があります。さらに悪いことに、parent.parent スコープ プロパティへの変更は、isolate スコープまたはその直接の親にまで及ばなくなりました。これは、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>
Javascript はmyMessage
外側の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
滴り落ちることはなくなり、その逆も同様です。2人は現在、互いに離れています。これが問題です。MyController2
MyDirective
だから私の質問は:
Angular には、スコープ プロパティ (
myMessage
この場合) のバインディングまたは継承を許可して、親スコープまで細流化する方法がありますか?そうでない場合、ディレクティブのisolateスコープの変更をparent.parentコントローラースコープのプロパティにどのように同期する必要がありますか? ディレクティブは、その親の構造について知ることができません。