高级
我在我的角度应用程序中标题视图和主视图。我希望标题有一个" back"根据我所在页面显示/隐藏的按钮。
我做了什么
app.js(摘录)
app.factory('globalServices', function() {
return {
showBack : false,
back: function() {
window.history.back();
}
};
});
header.html(摘录)
<a class="button-prev" ng-click="back()" ng-show="showBackButton">
Back
</a>
headerCtrl.js(摘录)
$scope.showBackButton = globalServices.showBack;
$scope.back = function() {
globalServices.back();
};
subPageCtrl.js(摘录)
globalServices.showBack = true;
问题
更改值后,按钮可行性不会刷新。我再看一页后,我才看到价值发生了变化。
有没有办法解决它?
我也愿意接受不同的方法。
修改
尝试调用$scope.$apply();
也失败,错误为$digest already in progress
,因为我将此值更改为subPageCtrl的构造函数的一部分。
答案 0 :(得分:1)
$scope.showBackButton = globalServices.showBack;
只将showBackButton设置为globalServices.showBack一次(在控制器初始化期间)。对globalServices.showBack的未来更改不会传播到$ scope.showBackButton,这是UI绑定的值。
您有两种选择:
1)
$scope.$watch('globalServices.showBack', function(){
$scope.showBackButton = globalServices.showBack;
}
此选项将监视globalServices.showBack以进行更改,然后将$ scope.showBackButton设置为匹配任何更改。
或
2)
$scope.globalServices = globalServices;
<a class="button-prev" ng-click="globalServices.back()" ng-show="globalServices.showBackButton">
Back
</a>
此选项将globalServices直接公开给您的UI。我就是这样做的。
答案 1 :(得分:1)
这是因为当布尔值被传递时,它们是按值分配的(它们是按值类型),因此当您执行$scope.showBackButton = globalServices.showBack;
时,它会将值$scope.showBackButton
赋值为{ {1}}因此,如果您更改globalServices.showBack
的值,则不会更改globalServices.showBack
的值。
要解决此问题,您应该使用通过引用分配的对象:
$scope.showBackButton