我有一个位于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中的属性值没有从之前的视图重置,然后在加载相邻的付费期视图时继续。
我希望这是有道理的。我会从太多的代码中拯救你,因为我认为基本的想法就在这里。
答案 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";
});