我有两个Angular控制器:
function Ctrl1($scope) {
$scope.prop1 = "First";
}
function Ctrl2($scope) {
$scope.prop2 = "Second";
$scope.both = Ctrl1.prop1 + $scope.prop2; //This is what I would like to do ideally
}
我不能在Ctrl2中使用Ctrl1,因为它是未定义的。然而,如果我试图像这样传递它。
function Ctrl2($scope, Ctrl1) {
$scope.prop2 = "Second";
$scope.both = Ctrl1.prop1 + $scope.prop2; //This is what I would like to do ideally
}
我得到一个错误。有人知道怎么做吗?
做
Ctrl2.prototype = new Ctrl1();
也失败了。
注意:这些控制器彼此之间不是嵌套的。
跨多个控制器共享变量的一种方法是创建一个服务,并将其注入到您想要使用它的任何控制器中。
简单的服务示例:
angular.module('myApp', [])
.service('sharedProperties', function () {
var property = 'First';
return {
getProperty: function () {
return property;
},
setProperty: function(value) {
property = value;
}
};
});
在控制器中使用服务:
function Ctrl2($scope, sharedProperties) {
$scope.prop2 = "Second";
$scope.both = sharedProperties.getProperty() + $scope.prop2;
}
这在本博客中有很好的描述(特别是第2课)。
我发现,如果你想跨多个控制器绑定到这些属性,如果你绑定到一个对象的属性而不是一个基本类型(布尔值,字符串,数字)来保留绑定引用,效果会更好。
示例:var property = {Property1: 'First'};而不是var property = 'First';。
更新:(希望)让事情更清楚这里是一个小提琴,显示了一个例子:
绑定到共享值的静态副本(在myController1中)
绑定到原语(字符串)
绑定到对象的属性(保存到作用域变量)
绑定到共享值,当值更新时更新UI(在myController2中)
绑定到返回原语(字符串)的函数
绑定到对象的属性
对对象属性的双向绑定
不创建服务的解决方案,使用$rootScope:
要跨应用控制器共享属性,你可以使用Angular $rootScope。这是共享数据的另一种选择,让人们知道它。
在控制器之间共享一些功能的首选方式是服务,读取或更改全局属性可以使用$rootscope。
var app = angular.module('mymodule',[]);
app.controller('Ctrl1', ['$scope','$rootScope',
function($scope, $rootScope) {
$rootScope.showBanner = true;
}]);
app.controller('Ctrl2', ['$scope','$rootScope',
function($scope, $rootScope) {
$rootScope.showBanner = false;
}]);
在模板中使用$rootScope(使用$root访问属性):
<div ng-controller="Ctrl1">
<div class="banner" ng-show="$root.showBanner"> </div>
</div>
第二种方法:
angular.module('myApp', [])
.controller('Ctrl1', ['$scope',
function($scope) {
$scope.prop1 = "First";
$scope.clickFunction = function() {
$scope.$broadcast('update_Ctrl2_controller', $scope.prop1);
};
}
])
.controller('Ctrl2', ['$scope',
function($scope) {
$scope.prop2 = "Second";
$scope.$on("update_Ctrl2_controller", function(event, prop) {
$scope.prop = prop;
$scope.both = prop + $scope.prop2;
});
}
])
Html:
<div ng-controller="Ctrl2">
<p>{{both}}</p>
</div>
<button ng-click="clickFunction()">Click</button>
欲了解更多细节,请参阅plunker:
http://plnkr.co/edit/cKVsPcfs1A1Wwlud2jtO?p=preview
我倾向于使用价值观,乐意任何人讨论为什么这是一个坏主意。
var myApp = angular.module('myApp', []);
myApp.value('sharedProperties', {}); //set to empty object -
然后按服务注入值。
在ctrl1中设置:
myApp.controller('ctrl1', function DemoController(sharedProperties) {
sharedProperties.carModel = "Galaxy";
sharedProperties.carMake = "Ford";
});
从ctrl2访问:
myApp.controller('ctrl2', function DemoController(sharedProperties) {
this.car = sharedProperties.carModel + sharedProperties.carMake;
});
跨多个控制器共享变量的一种方法是创建一个服务,并将其注入到您想要使用它的任何控制器中。
简单的服务示例:
angular.module('myApp', [])
.service('sharedProperties', function () {
var property = 'First';
return {
getProperty: function () {
return property;
},
setProperty: function(value) {
property = value;
}
};
});
在控制器中使用服务:
function Ctrl2($scope, sharedProperties) {
$scope.prop2 = "Second";
$scope.both = sharedProperties.getProperty() + $scope.prop2;
}
这在本博客中有很好的描述(特别是第2课)。
我发现,如果你想跨多个控制器绑定到这些属性,如果你绑定到一个对象的属性而不是一个基本类型(布尔值,字符串,数字)来保留绑定引用,效果会更好。
示例:var property = {Property1: 'First'};而不是var property = 'First';。
更新:(希望)让事情更清楚这里是一个小提琴,显示了一个例子:
绑定到共享值的静态副本(在myController1中)
绑定到原语(字符串)
绑定到对象的属性(保存到作用域变量)
绑定到共享值,当值更新时更新UI(在myController2中)
绑定到返回原语(字符串)的函数
绑定到对象的属性
对对象属性的双向绑定