我正在使用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函数,而不会在错误的控制器中创建错误的函数,从而弄乱我的代码?
答案 0 :(得分:2)
我认为您可以使用$on
和$broadcast
。如下所示;
;
$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