javascript - 如果从另一个指令调用,则当新数据传入时指令不会更新

标签 javascript angularjs angularjs-directive

我已经开始在 ui-router 中使用指令:

$stateProvider
  .state('book', {
    abstract: true,
    url: '/:book',
    template: '<book-tabs />'
  })
  .state('book.about', {
    url: '',
    template: '<book-about />'
  })
  .state('book.stats', {
    url: '/statistics',
    template: '<book-stats />'
  });

这是指令之一:

  export default function(app) {
    app.directive('bookStats', function() {
      return {
        restrict: 'E',
        controllerAs: 'statsTab',
        templateUrl: 'book-stats.tpl.html',
        controller: 'BookStatsCtrl'
      };
    });
  };

book-stats 指令内部,我想调用 stats-list 指令并传递 book 对象,该对象一开始是空的,但是HTTP 请求完成后有数据:

var vm = this;
vm.book = {};
Book.get.single({bookId: id}).then(function(res) {
    vm.book= res; // there is data
    return res;
});

在模板中:

<stats-list book="statsTab.book"></stats-list>

这是 stats-list 指令:

export default function(app) {
  app.directive('statsList', function() {
    return {
      restrict: 'E',
      scope: {
        book: '='
      },
      templateUrl: 'stats-list.tpl.html',
      controller: 'CircleRankListCtrl'
    };
  });
};

初始化时,使用空的 book 对象作为参数调用 stats-list 指令,并且当 HTTP 请求完成并且 book 对象获取一些数据,但 stats-list 指令未更新。

当我尝试在回调中调用 $scope.$apply 时,出现 $digest has in Progress 错误。

我使用了 Angular 1.4.7,但我也尝试将其全部更改为 Angular 1.5 组件。

最佳答案

Miško Hevery 就这个问题做了很好的演讲 here ,您也可以在其他博客文章中找到解释的解决方案(例如 Courtney Robinson 的 this one)。

总结:如果你没有点,那么你就做错了。

问题:当 promise 兑现时,您的book key 将被分配一个新值...

Book.get.single({bookId: id}).then(function(res) {
  vm.book= res; // here
  return res;
});

因此,子指令中原始 book 参数的任何值都已在父指令 book 中被覆盖(并且不再绑定(bind)到)。

解决方案:是将 book 绑定(bind)到一个对象,并将该对象传递给子指令。这样,当该对象上的 book 键发生更改时,对包含对象的引用将保持绑定(bind)到父指令中的对象。

vm.statsObj.book = {};
Book.get.single({bookId: id}).then(function(res) {
  vm.statsObj.book= res; // there is data
  return res;
});

<stats-list stats-obj="statsTab.statsObj"></stats-list>

export default function(app) {
  app.directive('statsList', function() {
    return {
      restrict: 'E',
      scope: {
        statsObj: '='
      },
      templateUrl: 'stats-list.tpl.html',
      controller: 'CircleRankListCtrl'
    };
  });
};

然后在 stats-list.tpl.html 模板中,您对 book 的引用将仍然绑定(bind)到父指令中的书

{{statsObj.book}}

关于javascript - 如果从另一个指令调用,则当新数据传入时指令不会更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35102381/

相关文章:

javascript - LeetCode #70 爬楼梯,如何加快我的解决方案?

javascript - 如何按特定字符对 select2 结果进行排序?

javascript - 根据所选单选按钮显示详细信息

angularjs - FAB快速拨号和“简单”下拉菜单不起作用

Angular js : accessing service methods from directive's link function

javascript - 如何在 angularjs 应用程序中注销时删除/清除存储在范围变量中的数据?

javascript - 将元素插入数组,其中对象由用户指定

javascript - HTML CSS 试图创建一个显示在文本上的输入字段

javascript - Angular http 从 ng-click 获取

javascript - AngularJS:动态绑定(bind) Click in 指令被触发多次