引导完成后执行一个函数(在所有指令链接函数运行之后)

时间:2014-01-16 18:47:12

标签: angularjs

在我的应用程序中,我有许多指令,可以使用controllerlink函数修改范围对象的各种属性。当用户正在使用该应用程序时,此对象上的属性将更改。我想在进行任何用户更改之前制作对象的深层副本,以便我可以恢复其原始状态。为此,在所有函数运行之后发生事件会很有用 - 也就是说,当Angular完成引导时。

我的第一个想法是创建一个运行函数的自定义指令,并将其添加为控制器中的最后一个元素。但是,似乎Angular以广度优先的方式加载指令,因此我的“最终”指令是最先链接的指令之一。

有办法做我想做的事吗?

2 个答案:

答案 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);
})

这里的不同之处在于我将一个服务(单例)注入到我的指令中并在编译时为其设置一个值。这是在调用控制器函数之前发生的,因此单例完全填充它的时间。

我希望这有助于其他人!