参数在服务中更改后的角度渲染视图

时间:2015-02-15 20:59:48

标签: javascript angularjs refresh

高级
我在我的角度应用程序中标题视图和主视图。我希望标题有一个" 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的构造函数的一部分。

2 个答案:

答案 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