我尽可能多地阅读有关$ digest循环和 $ scope。$ apply()的文章,但无法解决如何在回调中更改数据的问题。< / p>
这是我的方法:
vm.showAllResults = showAllResults;
function showAllResults(){
// Prevent 'bubbling'
event.preventDefault();
event.stopPropagation();
// Second parameter notifies search to show full list of elements
vm.search(vm.input.query, true);
$scope.$apply(function(){
vm.showAll = false;
});
}
vm.search(vm.input.query,true) - 正在使用 vm.showAll 进行一些异步。 之后我想将其设置为false。
但我无法进入$ scope。$ apply()。我究竟做错了什么?谢谢!
答案 0 :(得分:2)
直接回答你的问题:我非常怀疑你正在获取console.error:
$申请已在进行中
导致$ apply回调无法运行。
也就是说,您可以使用$timeout( cb )代替$ scope来解决这个问题。$ apply(cb)。如果你想使用它,请确保依赖注入它:
vm.showAllResults = showAllResults;
function showAllResults(){
// Prevent 'bubbling'
event.preventDefault();
event.stopPropagation();
// Second parameter notifies search to show full list of elements
vm.search(vm.input.query, true);
$timeout(function(){
vm.showAll = false;
});
}
然而,正如Avraam指出的那样,在我看来,vm.search应该是一个使用$q(也是依赖注入)的延迟方法,它返回一个promise,并调用.resolve / reject,你使用它与.then像这样:
vm.showAllResults = showAllResults;
function showAllResults(){
// Prevent 'bubbling'
event.preventDefault();
event.stopPropagation();
// Second parameter notifies search to show full list of elements
vm.search(vm.input.query, true)
.then( function() {
$timeout( function() { // <-- This $timeout probably not needed...
vm.showAll = false;
});
});
}