如何从工厂应用更新以进行查看

时间:2014-10-15 21:35:24

标签: javascript angularjs angularjs-service

我正在尝试在asyn模式下更改工厂中的引用,并且我没有看到更改已在我的视图中更新。

查看

<div ng-repeat="Message in Current.Messages">{{Message.text}}</div>

控制器

angular.module('test').controller('testCtrl', function($scope, Service) {
  $scope.Current = Service.Current;
});

angular.module('test').factory('Service', function($rootScope) {
  var Service = function() {
    this.Current = { Messages: [] };
    this.Socket = io.connect(/* ... */);
  }

  Service.prototype.asyncEvent = function(Another) {
    this.Socket.on('event', function() {
      $rootScope.$apply(function() {
        this.Current = Another; // After this change, i would like my view to display the new object but nothing happens...
      }.bind(this));
    });
  };

  var service = new Service();
  return service;
});

当我尝试使用.push()而不是更改引用时,它运行良好,所以我知道问题不是针对异步的事情。 但是我没有看到我如何使用从我的工厂到我的视图的参考,并且能够随时更改我指向的对象。

1 个答案:

答案 0 :(得分:0)

您的问题是,您通过Current覆盖了this.Current = Another;的引用并引用了新的对象引用,因此$scope.Current @ $scope.Current = Service.Current所持有的当前引用具有旧对象参考。所以它没有得到反映。您可以引入多个对象层次结构来解决此问题,尤其是当您从服务公开属性并且您希望它被消费者用作实时属性时,您可以共享不会更改的引用。

作为一个简单的修复,您可以this.Current.Messages = Another.Messages;代替this.Current = Another;,这样您就不会在服务实例化期间更改serviceInstance.Current属性所持有的引用,而是更改只有消息数组。

尝试: -

angular.module('test').factory('Service', function($rootScope) {
  var Service = function() {

    this.Current = { Messages: [] };
    this.Socket = io.connect(/* ... */);
  }

  Service.prototype.asyncEvent = function(Another) {
    this.Socket.on('event', function() {
      $rootScope.$apply(function() {
        this.Current.Messages = Another.Messages; 
      }.bind(this));
    });
  };

  var service = new Service();
  return service;
});

但是,当您从服务公开属性时,您应该小心,它可能会被其他消费者(控制器)意外地或其他方式覆盖,并且可能导致应用程序中的数据完整性问题。而是公开方法,实现承诺模式来传递数据,甚至可以使用pub / sub模式(甚至使用角度内置的事件总线)让消费者知道事件的发生。