Javascript AngularJS:如何在另一个控制器中执行方法?

Javascript AngularJS:如何在另一个控制器中执行方法?,javascript,angularjs,angularjs-scope,angular-services,Javascript,Angularjs,Angularjs Scope,Angular Services,我在谷歌上搜索过,但找不到关于如何正确操作的信息。似乎谷歌上的所有答案现在都过时了(使用AngularJS的旧版本) 我正在尝试在AngularJS模块上设置两个控制器。例如,第一个控制器正在处理$http GET请求。第二个控制器显示“成功”或“错误”消息。我希望能够从第二个控制器调用一个方法,并显示成功/错误消息 或者我应该为此使用服务/工厂吗?我读过关于服务的书,但不知道如何让这样的东西起作用 var module = angular.module('app', []); module.

我在谷歌上搜索过,但找不到关于如何正确操作的信息。似乎谷歌上的所有答案现在都过时了(使用AngularJS的旧版本)

我正在尝试在AngularJS模块上设置两个控制器。例如,第一个控制器正在处理$http GET请求。第二个控制器显示“成功”或“错误”消息。我希望能够从第二个控制器调用一个方法,并显示成功/错误消息

或者我应该为此使用服务/工厂吗?我读过关于服务的书,但不知道如何让这样的东西起作用

var module = angular.module('app', []);

module.controller('ApiController', ['$scope', '$http', function ($scope, $http) {
    $http.get('/api').
        success(function(data){
            // call AlertController('success')
        }).
        error(function(data){
            // call AlertController('failed')
        });
}]);

module.controller('AlertController', ['$scope', function ($scope) {
    $scope.message = {
        show_message: true,
        type: 'info',
        message: "Display message!"
    };
}]);
要么这样做,要么我想将传入警报推送到全局对象变量上,然后在显示后将其删除


有人知道如何正确设置吗?

以下是您如何创建工厂

    module.factory('appService', ['$window', '$http', '$q', function(win, $http, $q) {
    return{
        backendcall: function(){
            var deferred = $q.defer();
            $http.get('/yelp').
                success(function(data){
                    deferred.resolve(data);
                }).
                error(function(data){
                    deferred.resolve(status);
                });

            return deferred.promise;
        }
    }
  }]);
你的控制器是这样的

module.controller('AlertController', ['$scope', 'appService', function ($scope, appService) {
    appService.backendcall().then(function(response){
            $scope.message = {
            show_message: true,
            type: 'info',
            message: "Display message!"
        };  
    })

}]);

好的,让我们试试这个-你也应该去看看

信息服务:

module.service('MessageService', function ($timeout) {
    var messageQueue = [];
    var DISPLAY_TIME = 5000; // each message will be displayed for 5 seconds

    function startTimer() {
        $timeout(function() {
                // Remove the first message in the queue
                messageQueue.shift();
                // Start timer for next message (if there is one)
                if (messageQueue.length > 0) startTimer();
            }, DISPLAY_TIME);
    }

    function add(message) {
        messageQueue.push(message);
        // If this is the only message in the queue you need to start the timer
        if (messageQueue.length==0) startTimer();
    }

    function get() {
        if (messageQueue.length==0) return "";
        else return messageQueue[0];
    }

    return { add: add, get: get };
});
您也可以使用此服务:

module.service('ApiService', ['$http', function ($http) {
    return {
        get: function(url) {
            return $http.get(url);
        }
    };
}]);
您的搜索控制器:

module.controller('SearchController', ['$scope', 'ApiService', 'MessageService', function ($scope, api, messages) {
    api.get('/yelp').
    success(function(data){
        messages.add('success');
    }).
    error(function(data){
        messages.add('failed');
    });
}]);
module.controller('AlertController', ['$scope', 'MessageService', function ($scope, messages) {
    $scope.getMessage = function() { messages.get(); }
}]);
您的警报控制器:

module.controller('SearchController', ['$scope', 'ApiService', 'MessageService', function ($scope, api, messages) {
    api.get('/yelp').
    success(function(data){
        messages.add('success');
    }).
    error(function(data){
        messages.add('failed');
    });
}]);
module.controller('AlertController', ['$scope', 'MessageService', function ($scope, messages) {
    $scope.getMessage = function() { messages.get(); }
}]);
因此,在html中,您可以:

<div ng-controller="AlertController">
    <div>{{ getMessage() }}</div>
</div>

{{getMessage()}}

Hi的可能副本,您可以自己编写并使用模块注入将其注入控制器:angular.module('application',['AlertModule']),然后您可以使用它。但是有些东西是这样的。@AlirezaAhmadi-那篇文章已经有两年多的历史了,代码现在完全不同了。@master994-一旦我输入了“AlertModule”,我可以像调用AlertModule.queue(“新错误消息!”)一样调用这个方法吗?至于toastr,看起来太复杂了,不适合我使用。谢谢你!对这是依赖注入:)阅读这篇文章,这真的让人困惑。你能解释一下你的代码是怎么回事吗?嘿,谢谢。但我认为这并不是我问题的根本。我的问题是我试图将模型与控制器分开,这样我就可以在多个控制器中使用该模型的数据。例如,我想从SearchController将警报消息推送/保存到模型队列对象中,然后从AlertController中拉取/读取这些消息,以便AlertController可以更新/显示警报(即,5秒钟后,逐个隐藏警报,然后更新/删除消息队列以清除旧消息)。但不知道如何设置服务来充当此模型。太好了!这正是我想要看到的。非常感谢你!1.我不明白为什么服务使用返回{},但现在我知道它是如何工作的了。2.不知道视图可以使用调用函数进行输出。没有问题-我只是注意到
messageQueue.push(message)startTimer()
之前执行code>,因此我交换了这两行代码(以防给您带来麻烦)。我遇到了一个显示问题。如何在
ng repeat
语句中使用getMessage()?例如。
ng repeat=“message in getMessages()
,因为我希望getMessages()返回整个对象,而不是一次返回一条消息。出于某种原因,它不想绑定。AlertController调用消息。get()在init上。但是在那之后,它不会更新。我可以直接传递变量吗,或者它必须通过两端的函数吗?我让它工作了。一个缺点是我不能在视图中执行
{{ng show=“messages().length”}
,如果我传递的是json而不是函数,这是可能的[从服务到控制器中的$scope变量]。我有一个使用
ng repeat=“messages in messages()”
的视图,我想隐藏整个块,因为有0条消息,但无法直接这样做。