使用服务可以使用另一个控制器的范围吗?

时间:2014-03-27 16:48:23

标签: angularjs

我被告知你是否需要在控制器之间共享你应该使用服务。我有控制器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);
}]);

2 个答案:

答案 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
                                              ]
                                            });

我认为这可行。在我看来,这有利于选择你想在这些控制器之间共享的内容......但是可能有更优雅的方式来做到这一点。