Angularjs 角度:加载所有指令时控制器中的运行函数
我正在尝试编写一些代码,允许我在控制器中运行一个函数,但只有在整个dom设置好并准备好之后(包括指令链接函数run等) 我目前正在通过$rootScope广播在ctrl/service和指令之间进行通信。指令未拾取控制器加载时的第一次广播。原因当然是控制器在指令链接函数运行之前加载。我已经阅读了一些类似的问题,人们建议在这些电话中使用$timeout。不幸的是,这并不总是有效的,我不想用大量的$timeout调用扰乱我的ctrl/服务。因此,我正在寻找另一种解决我的问题的方法 沟通方式如下: 1.)控制器通知服务准备一些数据(通过服务中的函数调用) 2.)服务告知指令显示数据(通过广播) 3.)指令显示数据…在我的情况下是否显示:( 编辑: 由于计时在我的应用程序中至关重要,我基本上在寻找一种方法,在所有角度组件完成加载后立即在控制器中启动一个函数。控制器中的该函数将通过给范围变量赋值来显示内容。同时,它将开始花费时间。当然,我只能开始这样做一旦指令被加载,否则tmining错误或指令尚未准备好显示内容等 我读过Ben Nadel的一篇博文,这篇博文基本上展示了指令是如何加载的。我希望设置一个最后加载的外部指令,这样我就可以从那里触发已完成的加载。不幸的是,只要任何内部指令使用templateUrl,这就不起作用了。Angularjs 角度:加载所有指令时控制器中的运行函数,angularjs,angularjs-directive,Angularjs,Angularjs Directive,我正在尝试编写一些代码,允许我在控制器中运行一个函数,但只有在整个dom设置好并准备好之后(包括指令链接函数run等) 我目前正在通过$rootScope广播在ctrl/service和指令之间进行通信。指令未拾取控制器加载时的第一次广播。原因当然是控制器在指令链接函数运行之前加载。我已经阅读了一些类似的问题,人们建议在这些电话中使用$timeout。不幸的是,这并不总是有效的,我不想用大量的$timeout调用扰乱我的ctrl/服务。因此,我正在寻找另一种解决我的问题的方法 沟通方式如下: 1
使用$timeout会很糟糕。不要这样做。您无法定义服务器调用需要多长时间 我建议使用以下模式:
- 让控制器使用服务加载一些数据,并让 控制器中的promise将返回数据分配给范围变量
- 将该范围变量传递到指令中
- 在directive link函数中设置手表,当它加载时,它将从未定义值变为所需值。完成
YourService.all().then(function(data) {
$scope.data = data;
});
//在你看来
<some-directive your-data="data"></some-directive>
我提出了一些类似的想法,但我必须重新表述一下我的问题。Timinig在我的应用程序中至关重要,这就是为什么我需要确保在运行控制器中的第一个功能之前,一切都准备好了。但我可以使用watch方法而不是广播,因为指令至少会接听来电以显示某些内容。唯一的问题是lem现在是控制器中的值的更改和指令中的更新不会同时发生(我的意思是至少在彼此之后)是的,因为一切都是异步的,所以您需要使用正确的技术。我需要更多地了解您的问题,以帮助您进一步解决问题。此时,服务、控制器和指令之间的通信可以通过事件调度、数据绑定和其他可能的内容进行存档。
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();
});
}
}
});