观察 AngularJS 可观察量

Observing AngularJS observables

本文关键字:观察 AngularJS      更新时间:2023-09-26

使用AngularJS,我应该如何触发模型现在很脏,需要保存到服务器?除了用户点击"保存"按钮?

我想过使用$watch,但是当数据首次加载时,该东西会触发,因此您最终会到处都是这个黑客:

在 AngularJS 中观察模型变化时如何忽略初始负载?

您还可以$emit事件以触发保存,但在以下情况下:

  1. 在作用域上设置属性
  2. $emit该范围内的事件
  3. 在父控制器中使用$on捕获事件并查看属性

按照该顺序,在步骤 3 中声明的事件处理程序将看到在步骤 1 中进行更改之前一样的 scope 属性。

我在这里举了一个例子:

http://plnkr.co/edit/Il9TzUdCSBdewCxIKARZ

如果依次单击"foo"、"bar"、"foo"、"bar",则会看到事件侦听器始终落后于属性一步。

我假设这与何时处理与摘要周期相关的范围事件有关,但它似乎确实违反了 javascript 的定律。Angular 的家伙是如何设法做到的,所以当你改变它时属性不会改变!?

当我总是保存旧数据时,这让我有些头疼。

快速解决方法是使用$timeout来"延迟"保存,我假设直到摘要周期结束。虽然这有效,但它似乎很混乱。这是怎么回事?如果对范围的更改对事件处理程序不可见,则事件似乎毫无用处,不是吗?

有没有一种干净的方法可以做到这一点?

谢谢。

这是因为双向绑定在$digest循环之前不会更新,这发生在$emit之后。

我建议对数据使用$watch来触发保存。

// Controller
$scope.$watch('message', function(newVal, oldVal) {
  if (newVal === oldVal) {
    return;
  }
  // Handle update...
});

另一种选择是将对象而不是字符串传递到指令中。 通过这样做,$on侦听器将可以访问正确的数据。

例如:

// Controller
$scope.messageData = {message: "Initial message"};
// HTML
<div set-message="messageData">...</div>
// Directive
scope: {
  messageData: "=setMessage"
},
link: function(scope) {
  scope.setMessage = function(message) {
    scope.messageData.message = message;
    scope.$emit('messagechange');
  };
}