Angularjs 指令双向绑定变量更改不会触发父作用域上的 $digest
Angularjs directive two-way bound variable changes are not triggering $digest on the parent scope
如果某些 JS 在语法上不正确,我们深表歉意。我是一边看着我的 CoffeeScript
一边写的
我有一个文本编辑器,我已经提取到一个指令中,我想在它和它包含的模板之间共享一些状态:
主要包含模板
<div class="content">
<editor class="editor" ng-model="foo.bar.content" text-model="foo.bar"></editor>
</div>
模板控制器
angular.module('foo').controller('fooController', ['$scope', ... , function ($scope, ...) {
$scope.foo = {}
$scope.foo.bar = {}
$scope.foo.bar.content = 'starting content'
$scope.$watch('foo.bar', function () {
console.log('content changed')
}, true)
}
模板在其作用域对象 $scope.foo.bar
上与编辑器指令双向绑定。更改文本时,将触发编辑器的 'text-change' 处理程序并更改绑定对象上的 属性。
编辑器指令
angular.module('foo').directive('editor'), function (
restrict: 'E',
templateUrl: 'path/to/editor.html',
require: 'ng-model',
scope: {
textModel: '='
},
controller: [
...
$scope.editor = 'something that manages the text'
...
],
link: function (scope, ...) {
scope.editor.on('text-change', function () {
$scope.textModel.content = scope.editor.getText()
// forces parent to update. It only triggers the $watch once without this
// scope.$parent.$apply()
}
}
但是,在指令中更改此 属性 似乎并没有达到我在 foo.bar
上设置的深度 $watch。经过一番挖掘,我能够使用指令的父引用来强制执行 $digest 循环 scope.$parent.$apply()
。不过我真的不需要,因为 属性 是共享的,应该会自动触发。为什么不自动触发?
以下是我遇到的一些相关的好读物:
$watch an object
https://www.sitepoint.com/understanding-angulars-apply-digest/
on
函数是一个 jqLite/jQuery 函数。它不会触发摘要循环。它基本上在 angular 的意识之外。您需要使用 $apply.
手动触发摘要循环
如果某些 JS 在语法上不正确,我们深表歉意。我是一边看着我的 CoffeeScript
一边写的我有一个文本编辑器,我已经提取到一个指令中,我想在它和它包含的模板之间共享一些状态:
主要包含模板
<div class="content">
<editor class="editor" ng-model="foo.bar.content" text-model="foo.bar"></editor>
</div>
模板控制器
angular.module('foo').controller('fooController', ['$scope', ... , function ($scope, ...) {
$scope.foo = {}
$scope.foo.bar = {}
$scope.foo.bar.content = 'starting content'
$scope.$watch('foo.bar', function () {
console.log('content changed')
}, true)
}
模板在其作用域对象 $scope.foo.bar
上与编辑器指令双向绑定。更改文本时,将触发编辑器的 'text-change' 处理程序并更改绑定对象上的 属性。
编辑器指令
angular.module('foo').directive('editor'), function (
restrict: 'E',
templateUrl: 'path/to/editor.html',
require: 'ng-model',
scope: {
textModel: '='
},
controller: [
...
$scope.editor = 'something that manages the text'
...
],
link: function (scope, ...) {
scope.editor.on('text-change', function () {
$scope.textModel.content = scope.editor.getText()
// forces parent to update. It only triggers the $watch once without this
// scope.$parent.$apply()
}
}
但是,在指令中更改此 属性 似乎并没有达到我在 foo.bar
上设置的深度 $watch。经过一番挖掘,我能够使用指令的父引用来强制执行 $digest 循环 scope.$parent.$apply()
。不过我真的不需要,因为 属性 是共享的,应该会自动触发。为什么不自动触发?
以下是我遇到的一些相关的好读物:
$watch an object
https://www.sitepoint.com/understanding-angulars-apply-digest/
on
函数是一个 jqLite/jQuery 函数。它不会触发摘要循环。它基本上在 angular 的意识之外。您需要使用 $apply.