在我的应用程序中,我有许多指令,可以使用controller
或link
函数修改范围对象的各种属性。当用户正在使用该应用程序时,此对象上的属性将更改。我想在进行任何用户更改之前制作对象的深层副本,以便我可以恢复其原始状态。为此,在所有函数运行之后发生事件会很有用 - 也就是说,当Angular完成引导时。
我的第一个想法是创建一个运行函数的自定义指令,并将其添加为控制器中的最后一个元素。但是,似乎Angular以广度优先的方式加载指令,因此我的“最终”指令是最先链接的指令之一。
有办法做我想做的事吗?
答案 0 :(得分:1)
它的价值:版本1.2引入了一个无证的$$postDigest
函数。它允许您添加在摘要周期后执行的功能。该功能只执行一次。
所以你可以做类似
的事情module.controller('myController', function($scope) {
$scope.$$postDigest(function() {
var copyOfScope = angular.copy($scope);
//...
});
但要注意这样一个事实:无论你尝试什么,一旦异步发生任何事情,它都不会起作用。这可能是通过HTTP加载值或模板,或者使用超时执行某些功能。因此,实现你想要的东西可能是不可能的。
答案 1 :(得分:0)
我放弃了试图找到一个后链接钩子,而是尝试以不同的方式思考问题。
目标是让指令通知对象,该对象用作查找各种模型属性的“默认”值。例如,像:
<my-directive ng-model="foo" default-value="bar"></my-directive>
最初我的指令看起来像这样:
.directive("myDirective", function() {
return {
scope: { ngModel: '=', defaultValue: '@' },
link: function(scope, elem, attrs) {
$scope.ngModel = $scope.defaultValue;
// ...etc...
}
}
})
我意识到只要默认值不是绑定,就可以在编译步骤中完成。我确定的解决方案看起来像这样:
.service("defaultValues", function(someOtherDependency) {
this.aDefault = someOtherDependency.getDefault();
})
.directive("myDirective", function(defaultValues) {
return {
scope: { ngModel: '=' },
compile: function(elem, attrs) {
defaultValues[attrs.ngModel] = attrs.defaultValue;
}
// ...etc...
}
})
.controller("theController", function($scope, defaultValues) {
$scope.values = angular.copy(defaultValues);
})
这里的不同之处在于我将一个服务(单例)注入到我的指令中并在编译时为其设置一个值。这是在调用控制器函数之前发生的,因此单例完全填充它的时间。
我希望这有助于其他人!