在$ rootScope和控制器之间切换布尔值的最佳方法

时间:2016-01-12 01:22:00

标签: javascript angularjs

我有一个位于ng-view之上的navbar指令。它利用$ rootScope触发事件以显示某些视图中的按钮。

我正在尝试向指令模板添加一个按钮,该按钮将在控制器中为特定视图切换布尔值。该视图显示了一段时间,每个句点都有一个特定的布尔值,我想从指令切换。

布尔值保存在本地存储对象中,该对象在加载此特定视图的每次迭代时初始化。

首先,需要将值传递给指令,以便按钮可以显示为设置为true或false。当切换开关时,该布尔值需要从指令,通过$ rootScope到控制器,然后保存在存储对象中。

当视图改变时,整个过程需要重复。显然,开关需要能够多次打开和关闭。

目前,我从控制器向$ rootScope发出值,然后在指令链接函数中侦听该值。

然而,将$ rootScope值返回控制器的最佳方法是什么。我尝试在控制器中设置$ rootScope。$ watch,它似乎适用于任何单个页面,但在不同时间段之间导航时,布尔值的$ rootScope值未正确重置。

我尝试重置控制器初始化中的值,如下所示:

$rootScope.booleanValue = false;

但这不起作用。

我也尝试了以下内容:

$scope.$on('$routeChangeSuccess', function (next, current) {

        $rootScope.booleanValue = false;

    });

但我不能让整个周期正常工作。似乎$ rootScope中的属性值没有从之前的视图重置,然后在加载相邻的付费期视图时继续。

我希望这是有道理的。我会从太多的代码中拯救你,因为我认为基本的想法就在这里。

1 个答案:

答案 0 :(得分:0)

您要做的是从导航栏指令(隔离范围)和视图控制器共享状态。我建议您使用工厂提供商服务来共享该状态:

angular.module('myApp').factory('navbarState', function (){
    return {started: false}
});

在navbar指令中,注入服务并将状态存储在该服务中:

angular.module('myApp').directive('navigationBar', [
    '$rootScope',
    'navbarState',
    //'NavigationStackService',
    //'NavigationBarService',
    function ($rootScope, navbarState) {

        function link(scope, element) {

           scope.startEditMode = function(){
                console.log("Edit clicked");
                navbarState.started=true;
                //NavigationBarService.hideNavigationEdit();
                //NavigationBarService.showNavigationDone();
            };

            scope.finishEditMode = function(){
                console.log("Done clicked");
                navbarState.started=false;
                //NavigationBarService.hideNavigationDone();
                //NavigationBarService.showNavigationEdit();
            };
        }
        return {
            templateUrl: 'templates/navigation-bar.html',
            restrict: 'E',
            scope: {},
            link: link
        };
    }
]);

在视图控制器中,检索服务,将其放在控制器的范围内,然后在模板中使用它。

angular.module('myApp').controller('controller2', function(navbarState) {
    console.log("view controller2 started");
    var vm = this;
    vm.navState = navbarState;
    vm.message = "hello from ct2";
});

DEMO on JSFiddle