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()代码>只需查看我的更新答案