Angular:加载所有指令时在控制器中运行函数

时间:2014-11-05 02:15:18

标签: angularjs angularjs-directive

我正在尝试提供一些代码,这些代码允许我在控制器中运行一个函数,但只有在整个dom设置好并准备好(包括指令链接函数运行等)之后。

我目前正在通过$ rootScope广播在ctrl / service和指令之间进行通信。控制器加载时的第一次广播未被指令拾取。原因当然是控制器在指令链接功能运行之前加载。我在SO上读过一些类似的问题,人们建议在这些调用中使用$ timeout。遗憾的是,这并不总是有效,我不想让我的ctrl / services混乱很多$ timeout调用。因此,我正在寻找解决我问题的另一种方法。

通讯模式如下:

1。)控制器告诉服务准备一些数据(通过服务中的函数调用)

2。)服务告诉指令显示数据(通过广播)

3。)指令在我的情况下显示数据......(

修改

由于时间在我的应用程序中是必不可少的,所以我基本上都在寻找一种方法,只要所有角度组件都完成加载,就可以在控制器中启动一个功能。控制器中的该函数将通过为范围变量赋值来显示内容。与此同时,它将开始花时间。我当然只能在加载指令后才开始这样做,否则错误或指令尚未准备好显示内容等。

我读过Ben Nadel的博客文章,其中主要说明了如何加载指令。我希望设置一个最后加载的外部指令,这样我就可以从那里触发完成的加载。不幸的是,只要任何内部指令使用templateUrl,它就不会起作用。 http://www.bennadel.com/blog/2603-directive-controller-and-link-timing-in-angularjs.htm

1 个答案:

答案 0 :(得分:3)

使用$ timeout会很糟糕。不要这样做。您无法定义服务器调用的持续时间。

我建议使用这种模式:

  • 让控制器使用服务加载一些数据,并拥有 控制器中的promise将返回数据分配给范围变量。
  • 将该范围变量传递给您的指令。
  • 在指令链接功能中设置监视,当它加载时,它将从未定义到期望值。完成!

//在你的控制器中

YourService.all().then(function(data) {
  $scope.data = data;
});
在您的视图中

//

<some-directive your-data="data"></some-directive>

//在你的指令

angular.module('blah.directives').directive('someDirective', function() {
    return {
      scope: {
        yourData: '='
      },
      link: function(scope, element, attrs) {

        var watcher = scope.$watch('yourData', function() {
          if(scope.yourData === undefined) return;

          // at this point your data will be loaded, do work

          // optionally kill watcher at this point if it's not going to update again
          watcher();
        });
      }
    }
  });