2013-01-24 120 views
0

編輯:這個答案here似乎提供瞭解決方案;因爲我是一個懶惰的草皮,並且試圖避免在兩個地方(一次在服務器上,一次在客戶端)定義我的模型,我認爲必須有一種方法。通過在鏈接解決方案中使用自定義綁定,我可以從各種表單元素數據綁定屬性創建觀察對象,所以基本上它會從表單中構建模型。所以它有效地從表格中驅動模型定義。我還沒有決定,如果這是一個壞主意:)淘汰賽視圖模型代表單個對象

我想知道我做錯了什麼(或者甚至如果我甚至上午做任何錯誤)。我需要創建一個表單的時間,剛剛得到了一些簡單的文字/號碼的屬性編輯一個記錄:

{ItemCode:ABCD,LotNumber:1234,ID:4885,MeasuredValue1:90} 

我決定用KO與映射插件來做到這一點。我對ko相當陌生。 反正我結束了這樣的視圖模型:

var LotModel = function() { 
    var self = this; 
    self.Update = function(itemcode,lotnumber) { 
    var data = { ItemCode: itemcode, LotNumber: lotnumber } 
//DoAjax is just a utility function and is working fine. 
     DoAjax("POST", "LotHistory.aspx/GetLotHistory", data, 
     function(msg) { 
      ko.mapping.fromJS(msg.d, null, self); 
      ko.applyBindings(self); 
     }, 
     function(xhr, ajaxOptions, thrownError) { 
      AjaxFailure(xhr, ajaxOptions, thrownError); 
     } 
     ); 
    } 
} 

,後來我的代碼,

var lm = new LotModel(); 

終於在$(文件)。就緒現在

ko.applyBindings(lm); 

除了如果您在視圖模型中看到的每次加載數據,我都必須在vm的Update函數中重新調用ko.applyBindings(self)。 如果我註釋掉該行,它不會綁定。我認爲,這是因爲我只綁定一個單一的對象(即視圖模型本身就是ko映射插件完成其工作後的對象),但在我讀到的所有關於ko的地方似乎都說「你只需要調用這一次,永遠。「所以我不禁感到我失去了一些非常明顯的東西;在文檔就緒函數中註釋掉ko.applyBindings(lm)並沒有什麼區別,因爲我自動調用document.ready中的lm.Update,但是在viewmodel中註釋掉它。

所以我的問題是 - 我這樣做是錯誤的嗎?對於時間類型綁定中的單個對象是否過分矯枉過正?我的意思是不打擾我太多,它的工作原理,我想它,但仍,這是我嘮叨......

回答

1

這的確是最好的,如果不避免重新申請綁定多次。問題在於,您的視圖模型中沒有任何可觀察的屬性。到ko.mapping.fromJS的初始呼叫可以解決這個問題(或者您也可以手動添加觀測)例如: -

ko.mapping.fromJS({ 
    ItemCode: '', LotNumber: 0, ID: 0, MeasuredValue1: 0 
    }, null, self); 

的工作示例見琴:http://jsfiddle.net/antishok/qpwqH/1/

+0

感謝您的幫助。提到不存在的觀察結果給了我一個很大的線索。在這裏找到了一個可能的解決方案[http://stackoverflow.com/questions/6735225/knockout-js-mapping-plugin-without-initial-data-empty-form]。 –