两个控制器,相互调用功能

时间:2015-11-12 09:38:53

标签: angularjs

我正在使用SharePoint中的两个列表,所以在我的项目中我有三个控制器,一个主要 控制器,每个SharePoint列表一个。 我的列表是项目和任务。一个项目可以有几个任务。

当我想查看项目时,在itemList控制器中执行此操作:

$scope.loadItem = function(id){
    var promise = ItemService.getItem(id);
    promise.then(function(item){
        $scope.viewItem(item);
    }, function(err){console.log(err);})
};

然后,当我想加载任务时,我在taskList控制器

中有这个
$scope.loadTasks = function(parentId){
    var promise = TaskService.getTasks(parentId);
    promise.then(function(result){
        console.log(result);
    }, function(err){console.log(err);})
};

这是问题,当我加载项目$ scope.loadItem()时,我还想加载相关的任务 该项目,但该功能在另一个控制器(为了保持清洁)。

这就是我认为的样子:

 $scope.loadItem = function(id){
    var promise = ItemService.getItem(id);
    promise.then(function(item){
        $scope.loadTasks(item.Id);
        $scope.viewItem(item);
    }, function(err){console.log(err);})
};

但是我只能通过两种方式实现这一点,那就是将loadTasks函数移动到其中 与loadItems函数相同的控制器,或者与主控制器相同的控制器(因为它们都继承了该控制器), 但这会搞砸我的代码。

如何在我的itemList控制器中调用loadTasks函数,而不会在错误的控制器中创建错误的函数,从而弄乱我的代码?

2 个答案:

答案 0 :(得分:2)

我认为您可以使用$on$broadcast。如下所示;

itemList控制器中的

;

$scope.loadItem = function (id) {
    var promise = ItemService.getItem(id);

    promise.then((function (item) {
        $scope.viewItem(item);

        $rootScope.$broadcast('loadTasks', item.id);
    }, function (err) { console.log(err); });
};

在taskList控制器中;

$scope.loadTasks = function (parentId) {
    var promise = TaskService.getTasks(parentId);

    promise.then(function (result) {
        console.log(result);
    }, function (err) {console.log(err);})
};

$rootScope.$on('loadTasks', function (event, id) {
    $scope.loadTasks(id);
});

也许您可以使用$emit代替$broadcast。性能$emit优于$broadcast。您可以在this answer上找到有关该信息的更多信息。正如在该答案中所写的那样,当本地$scope被破坏时,你应该销毁该监听器。

即使您想要,也可以使用服务传递数据。

答案 1 :(得分:1)

您可以创建服务来实现此目的:

angular
  .module('myApp', [])
  .factory('shareService', shareService)

  function shareService() {
    var memory = {};
    return {
        store: function (key, value) {
            memory[key] = value;
        },
        get: function (key) {
            return memory[key];
        }
    };  
  }

然后,在您的控制器中,您必须:

// Controller 1
function FirstCtrl ($scope, shareService) {
  shareService.store('FirstCtrl', $scope)
  $scope.variableOne = 'First Controller Variable';
}

// Controller 2 (calling func from Controller 1)
function SecondCtrl ($scope, shareService) {
  $scope.getOne = function() {
    $scope.resOne = shareService.get('FirstCtrl').variableOne;
  }
}

这是plunker