我正在写一个接收推送通知的cordova聊天应用程序。
收到消息后,我会检查用户当前是否在聊天页面上。如果是,我想调用我的服务器来更新显示消息的数组。
我的推送功能在工厂中,当推送进入时,它会执行onNotification
我的问题是我无法访问控制器中的$scope.messages
数组来推送新邮件。我试过在我的工厂添加$ scope但是没有用。
如何从工厂访问或推送控制器中存在的阵列?
编辑:刚刚实现了另一种选择。工厂有没有办法在控制器中执行功能?如果可能的话,我也可以完成我需要的东西
注意:onNotification
是来自cordova的插件,在收到通知时会调用该插件。我无法将任何内容传递给onNotification。
这是我目前拥有的代码的基本/伪位。
聊天控制器
.controller('ChatCtrl',function($scope, ...etc){
$scope.messages = [];
}
厂
.factory('PushService'['$http',function($http){
onNotification: function(e){
$http.get('my_server_url')
.success(function(data){
// HERE I want to add the new data to $scope.messages from my controller,
// but I don't know how to access $scope.messages
// Alternatively, if it's possible to execute a function in my controller
// from this factory that would work as well
})
.error(function(data){ //handle error});
}
}]);
答案 0 :(得分:2)
通常不会按照您尝试的方式进行,因为Factory最有可能在整个应用程序生命周期中生效(直到浏览器选项卡关闭),而控制器则不会。当路线改变时,控制器正常被破坏。所以工厂无法依靠控制器存在......
Angular的做法是在工厂内创建消息数组。然后将工厂注入控制器,您可以在控制器中访问它,在那里您还可以将消息数组分配给$scope
。
使用您的代码的示例:
控制器
.controller('ChatCtrl',function($scope, PushService){
$scope.messages = PushService.messages;
});
厂
.factory('PushService'['$http',function($http){
return {
messages: [],
onNotification: function(e){
var messages = this.messages;
$http.get('my_server_url')
.success(function(data){
messages.push({ ... })
})
.error(function(data){ //handle error});
}
};
}]);
另一种选择是使用Angular的事件广播机制。例如,工厂可以$rootScope.$broadcast
向您的控制器发送一条消息,该消息将通过$scope.$on
接收。但是,这并不是真正推荐的,因为$broadcast
会将消息广播到您的范围的所有,这不是非常有效(特别是聊天应用程序中的消息)。
答案 1 :(得分:0)
不确定如何在控制器中调用onNotification,是否可以简单地将$ scope传递给onNotification?
答案 2 :(得分:0)
我为添加服务更改了几个代码?我希望这会奏效。
我使用$ q并承诺如果工厂有任何现有物品。
app.factory('PushService', ['$http', '$q', function ($http, $q) {
var messages = [];
return {
GetMessages: function (e) {
var deferred = $q.defer();
if (messages.length == 0) {
$http.get('my_server_url')
.success(function (data) {
//HERE I want to add the new data to $scope.messages from my controller, but I don't know how to access $scope.messages
messages = data.messages;
deferred.resolve(data.messages);
})
.error(function (data) { //handle error});
});
} else {
deferred.resolve(messages);
}
return deferred.promise;
},
AddMessage: function (message) {
messages.push(message);
}
};
}]);
app.controller('ChatCtrl',function($scope, PushService){
PushService.GetMessages().then(function(data) {
$scope.messages = data;
$scope.OnNotification = function(messageToAdd){
PushService.AddMessage(messageToAdd);
};
});
}
答案 3 :(得分:0)
如果要将数据从工厂连续推送到控制器,可以通过上升事件来实现。请看这里:http://plnkr.co/edit/94BDUno9BmbcphABV6jl 在你的情况下,它将是这样的:
<强>厂:强>
.factory('PushService'['$http',' $rootScope',function($http){
onNotification: function(e){
$http.get('my_server_url')
.success(function(data){
//rise the event
$rootScope.$broadcast('newMessage', data)
})
.error(function(data){ //handle error});
}
}]);
<强>控制器:强>
.controller('ChatCtrl',function($scope, ...etc){
$scope.messages = [];
$scope.$on('newMessage', function(event, data) {
$scope.messages.push(data); // 'Data to send'
});
}