【发布时间】: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是要使用的标志