在页面加载时在控制器之间传递数据,而不使用angularjs中的$ rootscope

时间:2015-08-25 14:54:11

标签: javascript angularjs

我有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。

2 个答案:

答案 0 :(得分:0)

实际上你的服务正在调用,这条线正在执行

$scope.showButton = MenuService.getStatus();

但是一旦你的child controller被加载,你只是设置状态但是为了显示按钮你应该在设置后获得状态 像这样,

app.controller('ChildMenuController', function($scope, MenuService) {
 MenuService.setStatus(true);
 $scope.$parent.showButton =  MenuService.getStatus();
});

这会将按钮设置为true并显示。

我已经用你的代码做了一个样本,请看看它

DEMO

答案 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属性的对象。状态对象始终是相同的,因此当在服务中更改值时,更改将传播到已请求该对象的每个人。