Angularjs 如何从服务调用控制器函数?
我有两个控制器不在同一范围内或具有父子关系 所以我想从controlleB调用ControllerA中的一个函数。在我的例子中,它是一个带有addItem函数的ListController,我想在单击submit后从页面上其他地方的addItemController调用此函数。我知道这应该适用于服务,但我不知道如何Angularjs 如何从服务调用控制器函数?,angularjs,controller,angular-services,Angularjs,Controller,Angular Services,我有两个控制器不在同一范围内或具有父子关系 所以我想从controlleB调用ControllerA中的一个函数。在我的例子中,它是一个带有addItem函数的ListController,我想在单击submit后从页面上其他地方的addItemController调用此函数。我知道这应该适用于服务,但我不知道如何 app.controller("listCtrl", ["$scope", "listSvc", function ($scope, listSvc){ $scope.lis
app.controller("listCtrl", ["$scope", "listSvc", function ($scope, listSvc){
$scope.list.data = listSvc.load("category");
$scope.addItem = function(newitem) {
$scope.list.data.unshift(newitem);
...
}
}]);
app.controller("addItemCrtl", ["$scope", "listSvc", function ($scope, listSvc){
$scope.addItem = function() {
listSvc.addItem($scope.newItem);
}
}]);
app.service('listSvc', function() {
return{
load: function(section){
...
},
addItem: function(item){
addItem(item); <<-- call function in listController
}
}
});
在我的控制器中,我做到了这一点
app.controller("listCrtl", ["$scope", "listSvc", function ($scope, listSvc){
listSvc.load("category");
...
$scope.$watch('listSvc.list.get()', function(data) {
$scope.list.data = data;
});
...
}]);
app.controller("addItemCrtl", ["$scope", "listSvc", function ($scope, listSvc){
...
$scope.addItem = function() {
listSvc.addItem($scope.newItem);
}
...
}]);
格雷戈;) 我刚刚自己解决了这个问题!也许这有助于: my控制器内部的功能:
var timeoutMsg = function() {
vm.$parent.notification = false;
};
我的服务中的函数(我必须从我的控制器中传入$timeout以及函数名,现在它可以工作了):
var vm=$scope
您不能在服务中包含$scope。所以,您如何考虑从服务调用函数呢?不要!那是个糟糕的设计。是的,那是真的:)那么这个问题该怎么解决呢?我应该把控制器的所有逻辑都放在我的服务中吗?当然,这样更好。控制器功能(按设计)是特定于应用程序的。服务应该以业务为中心,不受应用程序的影响。如果您可以以应用程序无关的方式将应用程序的功能分离为服务,那么您应该这样做。然后,如果需要,您可以注入其他依赖的服务。您说的“特定于应用程序”和“以业务为中心,与应用程序无关”是什么意思?您能给我一个简短的例子吗?;)
var timeoutMsg = function() {
vm.$parent.notification = false;
};
// original broken code:
// this.modalSend = function(vm) {
// fixed:
this.modalSend = function(vm, $timeout, timeoutMsg) {
vm.$parent.sendTransaction = function() {
// Show notification
vm.$parent.message = 'Transaction sent!';
vm.$parent.notification = true;
$timeout(timeoutMsg, 4000);
// original broken code:
// $timeout(timeoutMsg(), 4000);
};
}