2014-11-05 54 views
1

我试图想出一些代码,它允许我在控制器中运行一个函数,但只有整个dom被设置并准备就绪(包括指令链接函数运行等)。Angular:加载所有指令时在控制器中运行的函数

我目前正在通过$ rootScope广播在ctrl/service和指令之间进行通信。控制器加载时的第一个广播没有被指令拾取。原因当然是控制器在指令链接函数运行之前加载。我已经阅读了一些类似的问题,其中人们推荐使用$超时进行这些调用。这不幸并不总是工作,我不想混乱我的CTRL /服务与许多$超时调用。因此,我正在寻找解决我的问题的另一种方法。

通信模式如下:

1)控制器告诉服务准备一些数据(经由服务函数调用)

2.)服务通知指令,以显示数据(通过广播)

3)指令显示数据...或者没有我的情况:(

编辑:

由于时间在我的应用程序中至关重要,我基本上都在寻找一种方法,在所有角度组件完成加载后立即启动控制器中的功能。通过为范围变量赋值,控制器中的该功能将显示内容。同时它将开始花时间。我当然可以只开始这样做,一旦指令被加载,否则tmining是错误的或指令还没有准备好显示内容等。

我已经通过了本Nadel的博客文章,它基本上显示如何加载指令。我希望能够设置一个最后加载的外部指令,以便从那里触发完成的加载。不幸的是,只要任何内部指令使用templateUrl就不会起作用。 http://www.bennadel.com/blog/2603-directive-controller-and-link-timing-in-angularjs.htm

回答

3

使用$超时将是可怕的。不要这样做。您无法定义服务器通话需要多长时间。

我会建议使用这种模式:

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

//在你的控制器

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(); 
     }); 
     } 
    } 
    }); 
+0

我想出了类似的东西,但我我将不得不重新提一下我的问题。Timinig在我的应用程序中至关重要,这就是为什么我需要确保在我的控制器中运行第一个功能之前一切都已准备就绪。 – jimmy 2014-11-05 03:29:42

+0

但我可以使用手表方式而不是广播作为指令,至少可以接听电话以显示某些内容。现在唯一的问题是,控制器中的值的更改和指令的更新不会同时发生(我的意思是至少相互正确) – jimmy 2014-11-05 03:35:20

+0

是的,因为一切都是异步的,您需要使用正确的技术。我需要看到更多的问题来帮助你进一步。此时,服务,控制器和指令之间的通信可以用事件分派,数据绑定和其他可能的东西进行存档。 – wbeange 2014-11-05 03:43:07

相关问题