Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/419.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 什么';someChildScope.$apply()和$rootScope.$apply()之间的区别是什么?_Javascript_Angularjs - Fatal编程技术网

Javascript 什么';someChildScope.$apply()和$rootScope.$apply()之间的区别是什么?

Javascript 什么';someChildScope.$apply()和$rootScope.$apply()之间的区别是什么?,javascript,angularjs,Javascript,Angularjs,再详细一点: 假设我有服务: app.service('MyService', function(SomeWebSocketService) { function MyService() { this.object = {}; } MyService.prototype.subscribe = function() { var self = this; SomeWebSocketService.subscribe('someTopic', function(d

再详细一点:

假设我有服务:

app.service('MyService', function(SomeWebSocketService) {
  function MyService() {
    this.object = {};
  }
  MyService.prototype.subscribe = function() {
    var self = this;
    SomeWebSocketService.subscribe('someTopic', function(data) {
      angular.extend(self.object, data);
    }
  }
  return MyService;
}

// usage
app.controller('MyController', function($scope, MyService) {
  var model = new MyService();
  $scope.object = model.object;
});
当我从WebSocket服务获取消息时,我希望触发
$digest
循环。我的第一个倾向是这样做:

app.service('MyService', function(SomeWebSocketService) {
  function MyService(scope) {
    // scope from wherever this service was called
    this.scope = scope;
    this.object = {};
  }
  MyService.prototype.subscribe = function() {
    var self = this;
    SomeWebSocketService.subscribe('someTopic', function(data) {
      angular.extend(self.object, data);
      self.scope.$apply();
    }
  }
  return MyService;
}

// usage
app.controller('MyController', function($scope, MyService) {
  var model = new MyService($scope);
  $scope.object = model.object;
});
但我不喜欢在任意范围内传递。所以我想这样做:

app.service('MyService', function($rootScope, SomeWebSocketService) {
  function MyService() {
    this.object = {};
  }
  MyService.prototype.subscribe = function() {
    var self = this;
    SomeWebSocketService.subscribe('someTopic', function(data) {
      angular.extend(self.object, data);
      $rootScope.$apply();
    }
  }
  return MyService;
}

// usage
app.controller('MyController', function($scope, MyService) {
  var model = new MyService();
  $scope.object = model.object;
});

我会因为这样做而受到表演的打击吗?或者在一个
$scope
上调用
$apply
与在任何一个
$scope
上调用
$apply
相同吗?

这样说吧……当前门有芯片时,你是想粉刷整栋房子,还是只是粉刷门?在jsPerf.com中运行一个perf测试,可以找出哪一个更好您考虑过使用承诺而不是直接调用$apply()吗?如果您查看console.log,您可能会因为直接调用apply而出现许多异常。@Brian Promissions在我的实际用例中不起作用,它涉及WebSocket。因此,update函数实际上更像一个subscribe函数,在subscribe被调用后,对象会定期更新。谢谢@Tim。我还发现了一个问题,这个问题让我明白了一些。我想我会投票把它作为一个复制品关闭。