Javascript pageload时在控制器之间传递数据,而不使用angularjs中的$rootscope

Javascript pageload时在控制器之间传递数据,而不使用angularjs中的$rootscope,javascript,angularjs,Javascript,Angularjs,我有两个控制器,如下所示 app.controller('ParentMenuController', function ($scope,MenuService) { $scope.contentLoaded = false; $scope.showButton = false; $scope.showButton = MenuService.getStatus(); }); 控制员2: app.controller('C

我有两个控制器,如下所示

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();
在点击按钮或用户的任何操作时,我可以触发事件,但我的要求是在页面加载时,按钮不应可见。当childMenu控制器执行时,父控制器按钮应可见。我不想使用$broadcast,因为它需要$rootscope

注意:我的控制器和html有数百行。我只是在这里粘贴了此功能所需的代码。ChildMenuController(childMenu.html)有单独的html,ParentMenuController(parentMenu.html)有单独的html


因此$scope.showButton在ChildMenucontroller中不可用。这两种html都用作指令。主html是index.html。

实际上您的服务正在被调用,这一行正在执行

$scope.showButton=MenuService.getStatus()

但是,一旦您的
子控制器
加载,您只需设置状态,但为了显示按钮,您应该在设置后获取状态 像这样,

app.controller('ChildMenuController', function($scope, MenuService) {
 MenuService.setStatus(true);
 $scope.$parent.showButton =  MenuService.getStatus();
});
这会将按钮设置为true并显示

我已经用你的代码做了一个示例,请看一下


实际上,您的服务正在被调用,这一行正在执行

$scope.showButton=MenuService.getStatus()

但是,一旦您的
子控制器
加载,您只需设置状态,但为了显示按钮,您应该在设置后获取状态 像这样,

app.controller('ChildMenuController', function($scope, MenuService) {
 MenuService.setStatus(true);
 $scope.$parent.showButton =  MenuService.getStatus();
});
这会将按钮设置为true并显示

我已经用你的代码做了一个示例,请看一下

请参见此示例:

您需要使用包装器对象,以便更改其属性而不是主对象

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属性的对象。状态对象始终是同一个对象,因此当服务中的值发生更改时,更改将传播给曾经请求该对象的所有人。

请参见此示例:

您需要使用包装器对象,以便更改其属性而不是主对象

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属性的对象。状态对象始终是同一个对象,因此当服务中的值发生更改时,更改会传播到所有请求过该对象的人。

您的控制器名称定义“ChileMenuController”中是否有错误?已更正,但这是在这里发布时的打字错误。您是否尝试绑定到MenuService.status而不是调用getStatus方法?您是否可以共享htmlDo您的控制器名称定义“ChileMenuController”中有错误?请更正,但这是在此处发布时的打字错误。您是否尝试绑定到MenuService.status而不是调用getStatus方法?您是否可以共享htmlbut$scope.showButton在childMenuController中不可用。这是在父html中,而不是在子html中要更新父控制器对象,只需在子控制器中使用
$scope.$parent.yourParentObj
。对于您的场景,它将是
$scope.$parent.showButton=MenuService.getStatus()只需查看我的更新应答,但$scope.showButton在childMenuController中不可用。这是在父html中,而不是在子html中要更新父控制器对象,只需在子控制器中使用
$scope.$parent.yourParentObj
。对于您的场景,它将是
$scope.$parent.showButton=MenuService.getStatus()只需查看我的更新答案