我正在尝试提供一些代码,这些代码允许我在控制器中运行一个函数,但只有在整个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
答案 0 :(得分:3)
使用$ timeout会很糟糕。不要这样做。您无法定义服务器调用的持续时间。
我建议使用这种模式:
//在你的控制器中
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();
});
}
}
});