http://jsfiddle.net/garukun/u69PT/でもいじることができる次のコードがあります。
意見:
<div data-ng-app="testApp">
<div data-ng-controller="testCtrl">
<strong>{{pkey}}</strong>
<span data-test-directive data-parent-item="pkey"
data-parent-update="update(pkey)"></span>
</div>
</div>
JS:
var testApp = angular.module('testApp', []);
testApp.directive('testDirective', function ($timeout) {
return {
scope: {
key: '=parentItem',
parentUpdate: '&'
},
replace: true,
template: '<div><p>{{key}}</p>' +
'<button data-ng-click="lock()">Lock</button>' +
'</div>',
controller: function ($scope, $element, $attrs) {
$scope.lock = function () {
$scope.key = 'D+' + $scope.key;
console.log('DIR :', $scope.key);
// Expecting $scope.$parent.pkey to have also been
// updated before invoking the next line.
$scope.parentUpdate();
// $timeout($scope.parentUpdate); // would work.
};
}
};
});
testApp.controller('testCtrl', function ($scope) {
$scope.pkey = 'golden';
$scope.update = function (k) {
// Expecting local variable k, or $scope.pkey to have been
// updated by calls in the directive's scope.
console.log('CTRL:', $scope.pkey, k);
$scope.pkey = 'C+' + k;
console.log('CTRL:', $scope.pkey);
};
});
基本的に、私は分離されたスコープでディレクティブを設定しています。そこでは、親スコープ (pkey) からプロパティ (キー) を双方向バインディングし、コンテキストで呼び出されるメソッド (parentUpdate) を委任しています。親スコープの。
ここで、ディレクティブの ng-click イベント ハンドラー中に、parentUpdate メソッドを呼び出して、その中で何かをしたいと考えています。そのメソッドを呼び出すとき、親スコープのモデルが更新されていることを期待しています。しかし、実際にはそうではなく、これが私を困惑させていることです.
これは、parentUpdate 呼び出しを $timeout でラップすると期待どおりに機能するため、途中で $digest サイクルが欠落していることが原因である可能性があります。
誰かが欠けているものに光を当てることができますか? または、parentUpdate を適切に呼び出す方法は?