我有一个带有隔离范围的指令,该指令的值具有两种方式绑定到父范围。我正在调用一个方法来更改父作用域中的值,但是更改未应用到我的指令中。(不触发双向绑定)。
但是我不是从指令中更改值,而是仅在父范围中更改它。我阅读了解决方案,并指出了第五点:
The watch() created by the isolated scope checks whether it's value for the bi-directional binding is in sync with the parent's value. If it isn't the parent's value is copied to the isolated scope.
这意味着当我的父值更改为2时,将触发监视。它检查父值和指令值是否相同-如果不相同,则将其复制到指令值。好的,但是我的指令值仍然是1 …我缺少什么?
html:
<div data-ng-app="testApp"> <div data-ng-controller="testCtrl"> <strong>{{myValue}}</strong> <span data-test-directive data-parent-item="myValue" data-parent-update="update()"></span> </div> </div>
js:
var testApp = angular.module('testApp', []); testApp.directive('testDirective', function ($timeout) { return { scope: { key: '=parentItem', parentUpdate: '&' }, replace: true, template: '<button data-ng-click="lock()">Lock</button>' + '</div>', controller: function ($scope, $element, $attrs) { $scope.lock = function () { console.log('directive :', $scope.key); $scope.parentUpdate(); //$timeout($scope.parentUpdate); // would work. // expecting the value to be 2, but it is 1 console.log('directive :', $scope.key); }; } }; }); testApp.controller('testCtrl', function ($scope) { $scope.myValue = '1'; $scope.update = function () { // Expecting local variable k, or $scope.pkey to have been // updated by calls in the directive's scope. console.log('CTRL:', $scope.myValue); $scope.myValue = "2"; console.log('CTRL:', $scope.myValue); }; });
jsfiddle
像在控制器中$scope.$apply()更改后使用$scope.myValue:
$scope.$apply()
$scope.myValue
testApp.controller('testCtrl', function ($scope) { $scope.myValue = '1'; $scope.update = function () { // Expecting local variable k, or $scope.pkey to have been // updated by calls in the directive's scope. console.log('CTRL:', $scope.myValue); $scope.myValue = "2"; $scope.$apply(); console.log('CTRL:', $scope.myValue); }; });