Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将工厂更新应用于视图_Javascript_Angularjs_Angularjs Service - Fatal编程技术网

Javascript 如何将工厂更新应用于视图

Javascript 如何将工厂更新应用于视图,javascript,angularjs,angularjs-service,Javascript,Angularjs,Angularjs Service,我正在尝试以asyn模式更改工厂中的引用,但在我的视图中看不到已更新的更改 看法 工厂 angular.module('test').factory('Service', function($rootScope) { var Service = function() { this.Current = { Messages: [] }; this.Socket = io.connect(/* ... */); } Service.prototype.asyncEven

我正在尝试以asyn模式更改工厂中的引用,但在我的视图中看不到已更新的更改

看法

工厂

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()
而不是更改引用时,它运行良好,因此我知道问题与异步无关。
但是,我不知道如何使用从我的工厂到我的视图的引用,并且能够随时更改我指向的对象。

您的问题是,通过执行
this.Current=other,您正在用新对象引用覆盖
Current
,因此,
$scope.Current
@
$scope.Current=Service.Current
持有的当前引用具有旧的对象引用。所以它不会被反射。您可以引入多个对象层次结构来解决此问题,特别是当您从服务公开属性并且希望消费者将其用作活动属性时,您可以共享一个不变的引用

作为您案例中的一个简单修复,您可以执行
this.Current.Messages=other.Messages而不是
this.Current=另一个
,这样您在服务实例化期间不会更改由
serviceInstance.Current
属性保留的引用,而是只更改Messages数组

尝试:-


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

当前
服务.Current.Message的
消息
属性在哪里?或者你的意思是更新后的
$scope.Current=Service.Current
$scope.Current
有消息,而你在视图中执行的是Current.Messages?@PSL你是对的,我更新了我的帖子。而不是执行
this.Current=other执行
this.Current.Messages=other.Messages时会发生什么这解决了问题吗?效果很好,谢谢!我也不喜欢这种方法,你能告诉我,在这种情况下,我如何实现承诺模式吗?谢谢你的帮助@太好了!!既然这回答了你的具体问题,你介意接受它吗。对于您的问题,谁执行异步事件?基本上我所说的是,您的一个组件引发刷新数据的事件,对吗?另一个组件可以捕获相同的事件,它告诉它获取刷新的数据,这将是您的getData方法,它返回一个与数据解析的承诺。
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;
});
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;
});