动态$scope 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 元素已写入页面的时间?我已经四处寻找解决方案,似乎一个角度指令可能是这里的解决方案?

任何帮助将不胜感激!

[更新] - 好的,到目前为止,我已经找到了几个解决方案(其中一个导致我脸掌(。不过,这两种方式似乎都不是"最好"的方式。失败了几次

-

简单的方法。 通过 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(); 函数。

最新更新