Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/411.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 指令isn';当从另一个指令调用新数据时,t将更新_Javascript_Angularjs_Angularjs Directive - Fatal编程技术网

Javascript 指令isn';当从另一个指令调用新数据时,t将更新

Javascript 指令isn';当从另一个指令调用新数据时,t将更新,javascript,angularjs,angularjs-directive,Javascript,Angularjs,Angularjs Directive,我已经开始对ui路由器使用指令: $stateProvider .state('book', { abstract: true, url: '/:book', template: '<book-tabs />' }) .state('book.about', { url: '', template: '<book-about />' }) .state('book.stats', { url: '/sta

我已经开始对ui路由器使用指令:

$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 />'
  });
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
指令以空的
book
对象作为参数调用,当HTTP请求完成且
book
对象获得一些数据时,
stats list
指令不更新。

当我试图在回调中调用
$scope.$apply时,我得到了
$digest已在进行中的
错误。


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

Miško Hevery对这个问题进行了很好的讨论,你也可以在其他博客文章(如Courtney Robinson)中找到解决方案

小结:如果你没有一个圆点,你就做错了

问题:您的
书籍
密钥在承诺兑现时被分配一个新值

Book.get.single({bookId: id}).then(function(res) {
  vm.book= res; // here
  return res;
});
因此,无论原始
book
参数在child指令中的值是多少,都已在父指令
book
中被覆盖(不再绑定)

解决方案:将
book
绑定到一个对象,并将该对象传递给child指令。这样,当该对象上的
book
键更改时,对包含对象的引用仍将绑定到父指令中的对象

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'
    };
  });
};

Show
stats list.tpl.html
template.allow指令不应该使用自动关闭标记,然后应该正确关闭,就像您刚刚忘记使用
bindToController:true
一样。然后,它甚至可以使用简单的
vm.book={}
对象。您已经在使用点语法了。
Book.get.single({bookId: id}).then(function(res) {
  vm.book= res; // here
  return res;
});
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'
    };
  });
};
{{statsObj.book}}