Angularjs 如何从服务调用控制器函数?

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

我有两个控制器不在同一范围内或具有父子关系

所以我想从controlleB调用ControllerA中的一个函数。在我的例子中,它是一个带有addItem函数的ListController,我想在单击submit后从页面上其他地方的addItemController调用此函数。我知道这应该适用于服务,但我不知道如何

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);
    };
}