【问题标题】:AngularJS how to get actual factory's data in controller?AngularJS如何在控制器中获取实际工厂的数据?
【发布时间】:2015-07-22 14:03:19
【问题描述】:

当我收到套接字消息时,我有工厂。 如何在我的控制器中获得返回工厂的实际数据? 请帮忙。

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
    }

}]);

【问题讨论】:

    标签: angularjs factory


    【解决方案1】:

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

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

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

    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;
        });
        ...
    });
    

    【讨论】:

    • 谢谢!但是如果需要在控制器中获取数据后,删除(或重置)socket.collection,我该怎么办?
    • 您可以在我上面的回答中使用第二个选项 ($emit/$on) 以使控制器与对集合的更改保持同步。
    • 你能帮我写一个例子吗:)
    • 我上面的解决方案在第二个代码sn-p中有一个例子。
    【解决方案2】:

    您想将工厂注入您要使用数据的控制器中。下面是从工厂向控制器传递数据的基本示例。

    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;
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多