动态$ scope DOM元素尚未准备好进行插件初始化

时间:2016-02-06 23:26:24

标签: javascript angularjs dom

对于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元素已写入页面的时候?我已经做了一堆搜索解决方案,似乎一个有角度的指令可能是一个解决方案吗?

非常感谢任何帮助!

[更新] - 好的,到目前为止,我已经找到了几个解决方案(其中一个解决方案让我面对面)。似乎不是最好的&#34;虽然如此。失败了几次

- 简单的方法。通过jQuery document.ready()初始化插件; - 这有些原因让我感到愚蠢,因为我花了多长时间才尝试。(nvm,没有工作)

- 将我的$ http GET请求移动到角度&#34;工厂&#34;承诺返回。我会用一个加载范围,然后用另一个加载我的插件。似乎有点矫枉过正,但很有学习经验。

1 个答案:

答案 0 :(得分:2)

您需要将$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();函数。