我有一个指令,当以编程方式对底层模型进行更改时,我希望强制呈现。$scope.$apply
是惯用的。但是,如果不反复单击UI (这可能是手动强制摘要),我无法获得要呈现的指令。
有人能帮我识别如何手动触发摘要吗?
即使是this.scope.$root.$apply()
也没有效果。
但是,抓取父DOM节点并获取相关的作用域,然后从控制台调用$apply
确实有效。
但是,在代码中使用此DOM节点方法时,它不起作用。为什么会这样?
发布于 2015-08-05 00:41:28
有两件事要注意:
$scope.$digest()
。这将对作用域运行摘要,然后递归地对所有子作用域执行相同的操作。$scope.$apply()
就像做$rootScope.$digest()
一样。因为它是从根目录开始的,所以它调用了每个其他范围的摘要。所以$apply
可能是过量的。要回答您的问题,scope.$parent.$digest()
将触发scope
的父母的摘要。
但似乎引发文摘其实并不是你的问题。$apply
将在所有作用域上触发摘要,所以如果这不适用于您,我不认为您的问题只是需要触发摘要。
也许您不需要整个指令来重新呈现,而只需要它的一部分来更新?如果是这样,请考虑将数据绑定到某些共享服务(如这 )。
HTML
<div ng-app='app'>
<one></one>
<two></two>
</div>
JS
angular
.module('app', [])
.directive('one', function() {
return {
restrict: 'E',
scope: {},
template: "<input ng-model='shared.val'> {{ shared.val }}",
controller: function($scope, Shared) {
$scope.shared = Shared;
}
};
})
.directive('two', function() {
return {
restrict: 'E',
scope: {},
template: '<p> {{ shared.val }}</p>',
controller: function($scope, Shared) {
$scope.shared = Shared;
}
};
})
.factory('Shared', function() {
return {
val: ''
};
});
发布于 2015-08-04 17:57:37
这在某种程度上取决于。听起来,$parent
就是你想要的名字。scope.$root
只保存对$rootScope
的引用(而不是父元素范围)。简短的回答-尝试以下..。
scope.$parent.$apply()
更长的答案-以上假设您的子指令作用域是通过scope: true
从父继承的。有关主题和访问父作用域的其他可能方法的更多详细信息,请参见回答在AngularJS?。在父作用域中获得句柄后,只需在其上调用$apply()
即可。
我已经做了一个例子,它修改了jQuery .click()
事件的父作用域。考虑以下情况并观察父母的行为..。
app.directive('parent', function() {
return {
link: function(scope, elem, attrs) {
scope.value = 'parent'
}
}
});
app.directive('child', function() {
return {
scope: true,
link: function(scope, elem, attrs) {
scope.value = 'child'
elem.click(function() {
scope.$parent.value = 'modded!!' // -- previously 'parent'
scope.$parent.$apply();
})
}
}
});
JSFiddle链路 -工作示例
https://stackoverflow.com/questions/31813267
复制相似问题