2015-12-20 172 views
0

編輯 - 爲每條評論添加更多「逼真的代碼」。設計目標是所有模型都被視圖模型包裝,視圖模型作爲模型的代理。該視圖不會直接綁定到模型。此外,我有一個單獨的JavaScript類,它將模型發送到服務器或從服務器接收模型,並將其作爲依賴注入到視圖模型中。如何從視圖模型自動更新模型屬性?

下面,MessageModelcontent是用戶輸入的原始內容和/或服務器返回的內容。 MessageViewModel公開消息屬性,該屬性是模型的content屬性的格式化版本。

function MessageModel(id, content, nick) { 
    var self = this; 
    self.nick = nick; 
    self.content = content; 
    self.id = id; 
} 

// view needs to bind to properties that only exist on the view model 
function MessageViewModel(messageModel, dataService) { 
    var self = this; 
    self.id = ko.observable(messageModel.id); 
    self.message = ko.computed(function() { 
     // format the content for the view 
     return messageModel.nick + " <" + messageModel.content + ">"; 
    }); 
    self.saveMessage(function() { 
     // send the model up to the server 
     dataService.saveMessage(self.model); 
    }); 
    self.model = messageModel; 
} 

與我上面寫的,更改視圖模型需要推到模型,並從服務器接收模式時,需要被推向反映在視圖模型,然後在視圖中進行更改。如何在淘汰賽中做到這一點?

+0

,如果你想通過再結合來更新'messageModel.id'它必須是'observable';目前viewModel id是您唯一可觀察到的 – house9

+0

@ house9 - 不想通過綁定更新模型。想要通過綁定更新視圖模型,然後使用視圖模型更新模型。將模型直接耦合到視圖並不好。 –

+0

你應該顯示更實際的代碼。創建一個持有'id'的對象是沒有意義的,然後用另一個'id'將它包裝到另一個對象中,從而完成兩個相關的'id'可觀察對象。如果'id'就是你所需要的,我相信你只有一個帶有'id'的簡單視圖模型。所以,請讓樣本更真實,解釋爲什麼你有一個嵌套模型,當父母的'id'發生變化時你想要發生什麼,等等。你能用這些信息改進你的問題嗎? – JotaBe

回答

1

這是更好地認爲建模中的應用,而不是在你的應用程序代碼分開實現數據模型。數據模型在服務器上,不是嗎?將視圖模型中的值複製到應用程序中的數據模型是完全多餘的。將它們複製到服務器。 但是,如果你想,你可以subscribe到observable和複製其他地方的價值。

參見MVVM and ViewModels的文檔,並注意區分是「存儲」數據和應用程序之間的數據。數據(通常)存儲在服務器上。一旦將它帶入應用程序,它就是viewmodel數據。視圖模型和模型之間的接口(通常)是將數據加載到應用程序並將其保存回服務器的ajax調用。

您需要在JavaScript模型中的唯一的事情就是你的應用程序,因爲這是你寫的所有。這不是其他任何數據源。如果實際的數據模型發生變化,您需要更改應用程序的行爲,或者可以將更改隔離到加載和保存例程。有一箇中間數據模型是零值。

+0

是的,你所說的不是MVVM。查看具有與模型相同或相同屬性的模型是非常正常的。就服務器而言(與MVVM無關),DTO應該通過線路傳輸(我的模型目前是這樣)。我會看看訂閱。 –

+0

這不提供問題的答案。要批評或要求作者澄清,請在其帖子下方留言。 - [來自評論](/ review/low-quality-posts/10636745) –

+0

@ O.O請看我更新的回覆。 –