【问题标题】:How to tell if scope has been destroyed如何判断范围是否已被破坏
【发布时间】:2016-01-04 12:36:30
【问题描述】:

我正在将东西放入队列中并一个一个地处理它们。这些东西可能属于 AngularJS 范围。如果它所属的范围在我到达它时已经被破坏,我想跳过处理它。 (用户已离开显示结果的 UI,因此没有必要计算它。)

一个选项是这样的:

function enqueue(stuff, scope) {
  queue.push(stuff);
  scope.$on('$destroy', function() {
    queue.discard(stuff);
  });
}

但我觉得这有点重。它为每个“东西”添加了一个事件处理程序。 (当我使项目出队时,我还需要删除此事件处理程序。)我觉得最好在我出队时检查范围是否已销毁。

function process(stuff, scope) {
  if (scope.$destroyed) { // Fictional API.
    return; // Skip processing, scope is already gone.
  } else {
    ... // Actually process "stuff".
  }
}

scope.$destroyed 是虚构的,但我正在寻找类似的东西。谢谢!

【问题讨论】:

  • 你为什么要把scope-concept(这是一个Angular的结构来保存ViewModel)与“处理”项目(感觉应该属于模型)结合起来?
  • 我不确定你的意思。这些物品被遗弃,永远不会被查看。我还应该处理它们以满足某些模型视图的习惯吗?
  • 不,但是“放弃”的状态应该与项目一起反映,而不是通过范围构造间接反映。因此,我认为,无论导致范围破坏的原因,都应该导致该项目被标记为废弃。
  • 好的,但是我该怎么做呢?放弃发生在范围内。我必须以某种方式将其传播到该项目。如果没有您似乎反对的耦合,就无法做到这一点。或者可以吗?
  • 好吧,这也是一个批评 :) 如果您使用 ui.router,您可以使用 .onExit 回调将相应的项目标记为已放弃。但如果你坚持,scope.$$destroyed 是要使用的标志

标签: angularjs scope destroy


【解决方案1】:

您可以使用$scope.$$destroyed 标志来检查作用域是否被破坏。

【讨论】:

  • 谢谢!这是一个 5 年前的问题,但实际上我们仍然在项目中使用 Angular 1,所以很高兴知道这一点。我也非常接近我的“虚构 API”! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-20
  • 2021-02-04
  • 2011-05-19
  • 1970-01-01
  • 1970-01-01
  • 2017-03-29
相关资源
最近更新 更多