我有2个控制器,如下所示,
app.controller('ParentMenuController',
function ($scope,MenuService) {
$scope.contentLoaded = false;
$scope.showButton = false;
$scope.showButton = MenuService.getStatus();
});
控制器2:
app.controller('ChildMenuController',
function ($scope,MenuService) {
MenuService.setStatus(true);
});
服务:
app.factory('MenuService', function ($q,$http) {
var status= false;
var setStatus=function(newObj){
status=newObj;
};
var getStatus=function(){
return status;
};
return {
getStatus:getStatus,
setStatus:setStatus
};
});
我无法将状态设置为true,但下面的编码行根本没有执行,因此状态始终为false。
$scope.showButton = MenuService.getStatus();
单击按钮或用户i的任何操作都可以触发事件,但我的要求是在页面加载时,按钮不应该可见。当childMenu控制器执行时,父控制器按钮应该是可见的。我不想使用需要$ rootscope的$ broadcast。
注意:我的控制器和html有很多线条。我只是粘贴了这个功能所需的代码。 ChildMenuController(childMenu.html)有单独的html和ParentMenuController(parentMenu.html)有separete html。
所以$ scope.showButton在ChildMenucontroller中不可用。两个html都用作指令。主要的html是index.html。
答案 0 :(得分:0)
实际上你的服务正在调用,这条线正在执行
$scope.showButton = MenuService.getStatus();
但是一旦你的child controller
被加载,你只是设置状态但是为了显示按钮你应该在设置后获得状态
像这样,
app.controller('ChildMenuController', function($scope, MenuService) {
MenuService.setStatus(true);
$scope.$parent.showButton = MenuService.getStatus();
});
这会将按钮设置为true并显示。
我已经用你的代码做了一个样本,请看看它
答案 1 :(得分:0)
请参阅此示例:
http://plnkr.co/edit/TepAZGOAZZzQgjUdSpVF?p=preview
您需要使用包装器对象,以便更改其属性而不是主对象。
app.controller('ParentMenuController',
function ($scope,MenuService) {
$scope.contentLoaded = false;
$scope.showButton = MenuService.getStatus();
});
app.controller('ChildMenuController',
function ($scope,MenuService) {
MenuService.setStatus(true);
});
app.factory('MenuService', function ($q,$http) {
var status= {value:false};
var setStatus=function(newObj){
status.value=newObj;
};
var getStatus=function(){
return status;
};
return {
getStatus:getStatus,
setStatus:setStatus
};
});
它与您的代码完全相同,但state现在是一个具有value属性的对象。状态对象始终是相同的,因此当在服务中更改值时,更改将传播到已请求该对象的每个人。