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