2013-03-03 24 views
1

已解決!這是一個淘汰賽問題(錯誤的綁定)。但也許有人喜歡爭論或評論一般的代碼(dataservice,viewmodel等)。獲取一條數據庫記錄,顯示,更新並將其保存回數據庫

我試着構建一個Breeze示例,在那裏我得到一個數據庫記錄(使用fetchEntityByKey),顯示它進行更新,然後使用保存按鈕將更改寫回數據庫。我無法弄清楚如何讓它起作用。

我試圖具有的DataService(「類」)和視圖模型(「類」),用基因敲除的視圖模型綁定到視圖。

我非常感謝,如果有人可以提供樣品或提供一些提示。

Thankx,哈利

var dataservice = (function() { 
    var serviceName = "/api/amms/"; 
    breeze.NamingConvention.camelCase.setAsDefault(); 
    var entityManager = new breeze.EntityManager(serviceName); 

    var dataservice = { 
     serviceName: serviceName, 
     entityManager: entityManager, 
     init: init, 
     saveChanges: saveChanges, 
     getLocation: getLocation 
    }; 

    return dataservice; 

    function init() { 
     return getMetadataStore(); 
    } 

    function getMetadataStore() { 
     return entityManager.fetchMetadata() 
      .then(function (result) { return dataservice; }) 
      .fail(function() { window.alert("fetchMetadata:fail"); }) 
      .fin(function() { }); 
    } 

    function saveChanges() { 
     return entityManager.saveChanges() 
      .then(function (result) { return result; }) 
      .fail(function() { window.alert("fetchEntityByKey:fail"); }) 
      .fin(function() { }); 
    } 

    function getLocation() { 
     return entityManager.fetchEntityByKey("LgtLocation", 1001, false) 
      .then(function (result) { return result.entity; }) 
      .fail(function() { window.alert("fetchEntityByKey:fail"); }) 
      .fin(function() { }); 
    } 
})(); 

var viewmodel = (function() { 
    var viewmodel = { 
     location: null, 
     error: ko.observable(""), 
     init: init, 
     saveChanges: null 
    }; 

    return viewmodel; 

    function init() { 
     return dataservice.init().then(function() { 
      viewmodel.saveChanges = dataservice.saveChanges; 
      return getLocation(); 
     }) 
    } 

    function getLocation() { 
     return dataservice.getLocation().then(function (result) { 
      return viewmodel.location = result; 
     }) 
    } 
})(); 

viewmodel.init().then(function() { 
    ko.applyBindings(viewmodel); 
}); 
+0

你能粘貼一個代碼示例嗎?您是否收到saveChanges調用的錯誤? – Richard 2013-03-03 19:59:24

+0

嗨理查德...我已經添加了上面的代碼。不,我沒有從調用saveChanges中得到一個錯誤 – iwhp 2013-03-04 14:32:34

+0

嗨,理查德......這不是Breeze的編碼問題,我在Knockout上做了一些錯誤。也許你想評論上面的代碼... Thankx! – iwhp 2013-03-04 15:40:42

回答

0

高興你解決它。不禁注意到您添加了大量無用的回調。我想不出有這樣的理由。您還明確要求提供元數據。但是你打給fetchEntityByKey的電話會隱式地爲你做,因爲如你所說的,它總是會去服務器。

此外,在數據服務中重新拋出失敗回調中的錯誤是一個好主意,這樣調用者(例如ViewModel)可以添加自己的失敗處理程序。沒有重新拋出,調用者的失敗回調將不會聽到它(Q保證機器就好像第一個失敗處理程序「解決了」問題一樣)。

因此,您的DataService可以減少到:

 
var dataservice = (function() { 
    breeze.NamingConvention.camelCase.setAsDefault(); 
    var serviceName = "/api/amms/"; 
    var entityManager = new breeze.EntityManager(serviceName); 

    var dataservice = { 
     serviceName: serviceName,  // why are you exporting this? 
     entityManager: entityManager, 
     saveChanges: saveChanges, 
     getLocation: getLocation 
    }; 

    return dataservice; 

    function saveChanges() { 
     return entityManager.saveChanges() 
      .fail(function() { 
       window.alert("saveChanges failed: " + error.message); 
       throw error; // re-throw so caller can hear it 
      }) 
    } 

    function getLocation() { 
     return entityManager.fetchEntityByKey("LgtLocation", 1001, false) 
      .then(function (result) { return result.entity; }) 
      .fail(function() { 
       window.alert("fetchEntityByKey failed: " + error.message); 
       throw error; // re-throw so caller can hear it 
      }) 
    } 
})(); 

我不想作過多的這一點。也許你會給我們更精彩的東西。但是,如果你(或讀者)認爲這些方法總是必要的,我想表明他們不是。

相關問題