2013-07-04 212 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'); 
    }; 
}