如何从工厂推送到控制器阵列?或从工厂执行控制器功能

时间:2014-09-02 20:35:50

标签: angularjs

我正在写一个接收推送通知的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});

   }
}]);

4 个答案:

答案 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'
  });

}