AngularJS如何在控制器中获取实际工厂的数据?

时间:2015-07-22 14:03:19

标签: angularjs factory

我有工厂,当我收到套接字消息时。 我怎样才能在我的控制器中获得工厂的实际数据? 请帮助。



app.factory('socket',['$rootScope', function($rootScope) {

    connection.open();

    var connection = new autobahn.Connection({
        url: 'wss://site.com:6555/',
        realm: 'realm'
    });

    var collection = {
       'topic1': [],
       'topic2': []
    };

  function onevent(args) {
      console.log("Event:", args[0]);
      collection.topic1.push(args[0]);
   }

  connection.onopen = function(session) {
   session.subscribe(userid, onevent);
  }

    return {
       collection: collection
    }

}]);




2 个答案:

答案 0 :(得分:2)

工厂无法将数据推送到控制器,但控制器可以从工厂取出。为此,请将工厂注入控制器:

app.controller('yourController', ['$scope', 'socket', function($scope, socket) {
    ...
    $scope.yourControllerCollection = socket.collection;
    ...
});

如果您希望控制器在套接字工厂收到事件并更新集合时自动更新,您可以始终将$ rootScope注入工厂并$ $发出控制器可以侦听的事件。类似的东西:

app.factory('socket',['$rootScope', function($rootScope) {

   ...
   function onevent(args) {
      console.log("Event:", args[0]);
      collection.topic1.push(args[0]);
      $rootScope.$emit('SocketCollectionUpdated', collection); // Note that you can name your event whatever you want.
   }
   ...

}]);

app.controller('yourController', ['$rootScope', '$scope', 'socket', function($rootScope, $scope, socket) {
    ...
    $scope.yourControllerCollection = socket.collection;
    $rootScope.$on('SocketCollectionUpdated', function (event, data) {
        $scope.yourControllerCollection = data;
    });
    ...
});

答案 1 :(得分:1)

您希望将工厂注入要使用数据的控制器中。这是将数据从工厂传送到控制器的基本示例。

app.factory('sharedData', function() {
 return {
  name: 'Daniel'
 };
});

然后在您的控制器中,您可以简单地将此数据对象从工厂设置为$ scope。

app.controller('MainController', function($scope, sharedData) {
 $scope.data = sharedData;
});

因此,在您的情况下,只需创建一个控制器并注入sockets工厂,就像这样

app.controller('sockets', function($scope, sockets) {
 $scope.collection = collection;
});