我被告知你是否需要在控制器之间共享你应该使用服务。我有控制器A,它是新闻网站的列表,而控制器B是来自控制器A的站点上的文章列表。控制器B包含文章列表和用于显示文章的iframe。但是当你点击控制器A时,它应淡出iframe并淡入列表。为了实现这一点,我将控制器B的范围提供给注入控制器A和控制器B的服务。我的问题是它是否可以这样做。
基本上,我这样做:
app.factory("sharedService", function () {
var $scope = null;
return {
SetScope: function (scope) {
$scope = scope;
},
ControllerB_Action: function () {
$scope.doSomething();
}
};
});
app.controller("controllerA", ["$scope", "sharedService", function ($scope, sharedService) {
$scope.onaction = function () {
sharedService.ControllerB_Action();
}
}]);
app.controller("controllerB", ["$scope", "sharedService", function ($scope, sharedService) {
sharedService.SetScope($scope);
}]);
答案 0 :(得分:1)
我想说它不是一个好的模式,因为基本上$scope
是一个代表你当前视图或DOM状态的Object。控制器(和/或Link
- 指令的功能)是此状态与应用程序逻辑之间的粘合 - 所以在我看来,$scope
- 对象应始终保留在控制器/链接中。
因此,如果您想在两个控制器之间共享数据,您应该提取您想要在服务中共享的内容,但不要将整个范围放在那里(因为它有很多您不需要的并且想要在两个控制器内部的其他信息)。
您可以做的只是链接您想通过引用分享的数据 - 这样,您的服务也将在两个范围之间同步数据。
答案 1 :(得分:1)
可能有这样做的世界,但我会告诉你我会做什么:
我使用事件发射器。
免责声明:我尚未测试此代码
假设控制器B嵌套在控制器A中:
Controller A
var controllerBFunction_A;
$scope.$on('EventFromControllerB',function(data){
controllerBFunction_A = data.sharedFunctions.controllerBFunction_A;
});
Controller B
$scope.$emit('EvenFromControllerB',{
sharedFunctions: [
controllerBFunction_A,
controllerBFunction_B,
someOtherObject
]
});
我认为这可行。在我看来,这有利于选择你想在这些控制器之间共享的内容......但是可能有更优雅的方式来做到这一点。