AngularJS世界很新,除了我挑选的一些教程和演示之外,这是我第一次尝试深入构建一些东西。因此,如果我没有正确解释可能是一个简单的问题,请道歉!
我有一个看起来像这样的控制器:
myApp.controller('ShowCtrl', function($scope, $routeParams, $http) {
$http({
method: 'GET',
url: 'rest/details/'+ $routeParams.identifier
}).then(function successCallback(response) {
$scope.shows = response.data;
myPlugin.init();
}, function errorCallback(response) {
$scope.shows = "something bad happened";
});
});
这会向自定义 REST 接口发出 GET 请求,该接口调用外部/第三方 api。然后,我获取该 api 响应,将其分配给范围,并循环遍历它以显示我的部分.html中的项目
<li ng-repeat="(key, show) in shows" class="required-element">
{{ show.title }}
</li>
这很好用。范围有响应,我可以按预期循环和显示元素。
问题在于我还使用了一个插件,该插件似乎在元素写入 DOM 之前被初始化。
你可以在上面的代码中看到,插件的 .init((; 是在将 api 响应分配给控制器$scope后调用的。因此,插件中的任何功能都不会绑定到这些元素。
有没有办法将我的 init((; 推迟到我可以确定 DOM 元素已写入页面的时间?我已经四处寻找解决方案,似乎一个角度指令可能是这里的解决方案?
任何帮助将不胜感激!
[更新] - 好的,到目前为止,我已经找到了几个解决方案(其中一个导致我脸掌(。不过,这两种方式似乎都不是"最好"的方式。失败了几次
简单的方法。 通过 jQuery document.ready(( 初始化插件; - 这出于某种原因起作用,让我对尝试花了多长时间感到愚蠢。 (NVM,不起作用(
- 通过将我的$http GET请求移动到一个有角度的"工厂",并承诺返回。我会用一个加载范围,然后用另一个加载我的插件。似乎矫枉过正,但相当的学习经验。
$timeout
注入控制器并像这样使用它:
myApp.controller('ShowCtrl', function($scope, $routeParams, $http, $timeout) {
$http({
method: 'GET',
url: 'rest/details/'+ $routeParams.identifier
}).then(function successCallback(response) {
$scope.shows = response.data;
$timeout(function() {
myPlugin.init();
});
}, function errorCallback(response) {
$scope.shows = "something bad happened";
});
});
这样,只有在摘要循环结束并呈现视图后,您才会调用 myPlugin.init();
函数。