2013-07-04 49 views
2

使用AngularJS,我该如何触发模型现在变脏,需要保存到服务器?除了用户点击“保存”按钮?观察AngularJS的可观察性

我想用$表,但是当第一次加载数据的东西大火所以你最终通过这个修改,所有的地方:

How do I ignore the initial load when watching model changes in AngularJS?

也$可以发出事件来触发保存,但是当你:

  1. 集上范围的属性
  2. $上范围
  3. 捕获电子发射事件与$上发泄在父控制器,并期待在依次属性

,事件处理程序步骤3将看到scope属性,因为它是声明的变化则步骤之前1.

我在这里组建一个例子:

http://plnkr.co/edit/Il9TzUdCSBdewCxIKARZ

:如果你点击FOO,然后吧,那么富,那么酒吧,你会看到该事件监听器总是一步属性后面。

我认为这与范围事件与摘要循环相关的处理有关,但它确实似乎违反了JavaScript规则。 Angular的人是如何设法让它改变的,所以财产不会改变!?

当我总是保存旧数据时,这让我头脑发痒。

快速修复是使用$超时“推迟”保存,我假设直到摘要循环结束。虽然这起作用,但似乎很混乱。这里发生了什么?事件似乎毫无用处,如果对作用域的更改对事件处理程序不可见,不是吗?

有没有干净的方式做到这一点?

谢谢。

回答

1

这是因为双向绑定不会更新,直到$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'); 
    }; 
}