我是AJ的新手,我试图与另一个控制器共享$ scope.showdropdown指令,以便第二个控制器可以在其正文中调用此指令。
.controller('firstCtrl', function($scope){
$scope.showdropdown = false; // this is part of this controller
})
.controller('secondCtrl', function($scope){
if(username and pass correct){
$scope.showdropdown = true; // I want to call this here, but I can't do it bcoz its not part of the same controller!!!
}
})
我尝试了各种各样的东西,工厂等,没有运气 有人可以告诉我怎么能这样做!
答案 0 :(得分:3)
如果只需要在控制器之间共享简单数据(即没有功能,验证或其他模型逻辑),则可以使用value
服务:
.controller('firstCtrl', function($scope, myVal){
$scope.shared = myVal; // 'shared' on scope now references value service
$scope.shared.showdropdown = false;
})
.controller('secondCtrl', function($scope, myVal){
$scope.shared = myVal;
if(username and pass correct){
$scope.shared.showdropdown = true; // updates myVal value
}
})
.value('myVal', {}) // register service, initializing with an object object
factory
或service
服务类型的概念相同,实现非常相似。如果您需要共享功能而不仅仅是数据,请使用其中一个。工厂示例:
.controller('firstCtrl', function($scope, MyFactory){
$scope.shared = MyFactory;
...
})
.controller('secondCtrl', function($scope, MyFactory){
$scope.shared = MyFactory;
...
})
.factory('MyFactory', function(){
var obj = {
//showdropdown: false
};
obj.someFunc = function(){};
return obj;
})
答案 1 :(得分:0)
<!-- Nested Scopes -->
<div ng-controller="ParentCtrl">
<p>Parent Scope</p>
<ul>
<li> {{ford}}</li>
<li> {{chevy}}</li>
<li>{{dodge}}</li>
</ul>
<div ng-controller="ChildCtrl">
<p>Child Scope</p>
<ul>
<li> {{apple}}</li>
<li> {{samsung}}</li>
<li>{{motorola}}</li>
</ul>
<div ng-controller="AnotherChildCtrl">
<p>2nd Child Scope</p>
<ul>
<li> {{boeing}}</li>
<li> {{grumman}}</li>
<li>{{lockheed}}</li>
</ul>
<p>Combination of three scopes</p>
<ul>
<li> From parent - {{ ford }}</li>
<li> From child - {{ motorola }}</li>
<li> From anotherChild - {{ lockheed }}</li>
</ul>
</div>
</div>
The result looks like this …
Parent Scope
• Mustang
• Corvette
• Charger
Child Scope
• iPhone
• Galaxy
• MotoX
2nd Child Scope
• 747
• F-14
• F-35
Combination of three scopes
• From parent - Mustang
• From child - MotoX
• From anotherChild - F-35
如果您需要访问父范围之外的范围(在此示例中) - 请勿!配置代码,以便在当前范围内提供所需的范围 - 或者您可以创建一个服务来存储以后需要的值。例如。您可能拥有UserService。当有人登录时,将用户对象保存到UserService,然后在需要获取用户对象的其他地方调用UserService.getCurrentUser()...时不要尝试在当前层次结构之外的某个范围内找到它。
如果您正在编写指令,则可能会创建隔离范围。因此,在您的指令中,作为参数传入您可能需要的任何范围值,并将它们放在隔离范围中。
这是一种非常罕见的情况,您需要使用$ parent或$ rootScope,并且应避免在99.9999%的时间内使用它们。
答案 2 :(得分:0)
或..如果您想在应用中使用某些共享状态/方法,可以使用$ rootScope ..
.controller('firstCtrl', function($rootScope){
$rootScope.shared = 123;
})
.controller('secondCtrl', function($rootScope){
console.log($rootScope)
})