Javascript 指令isn';当从另一个指令调用新数据时,t将更新
我已经开始对ui路由器使用指令: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
$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}}