1

解决了!这是一个淘汰赛问题(错误绑定)。但也许有人喜欢争论或评论一般的代码(数据服务、视图模型等)。

我尝试构建一个 Breeze 示例,在其中获得一个数据库记录(使用fetchEntityByKey),显示它以进行更新,然后使用保存按钮将更改写回数据库。我不知道如何让它工作。

我试图拥有一个数据服务('class')和一个viewmodel('class'),将带有 Knockout 的 viewmodel 绑定到视图。

如果有人可以提供样本或提供一些提示,我将不胜感激。

谢谢,哈利

 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);
 });
4

1 回答 1

0

很高兴你解决了。不禁注意到您添加了大量的无操作回调。我想不出这样做的理由。您还明确要求提供元数据。但是您的调用fetchEntityByKey会为您隐式执行此操作,因为正如您调用的那样,它总是会转到服务器。

此外,最好在数据服务内的失败回调中重新抛出错误,以便调用者(例如,ViewModel)可以添加自己的失败处理程序。如果不重新抛出,调用者的失败回调将听不到它(Q Promise 机制就像第一个失败处理程序“解决”了问题一样)。

因此,您的数据服务可以简化为:

var数据服务=(函数(){
     微风.NamingConvention.camelCase.setAsDefault();
     var serviceName = "/api/amms/";
     var entityManager = 新微风.EntityManager(serviceName);

     变量数据服务 = {
         serviceName: serviceName, // 你为什么要导出这个?
         实体管理器:实体管理器,
         保存更改:保存更改,
         获取位置:获取位置
     };

     返回数据服务;

     函数 saveChanges() {
         返回 entityManager.saveChanges()
             .失败(函数(){
                 window.alert("保存更改失败:" + error.message);
                 抛出错误;// 重新抛出,以便调用者可以听到
             })
     }

     函数获取位置(){
         return entityManager.fetchEntityByKey("LgtLocation", 1001, false)
             .then(function (result) { return result.entity; })
             .失败(函数(){
                 window.alert("fetchEntityByKey 失败:" + error.message);
                 抛出错误;// 重新抛出,以便调用者可以听到
             })
     }
 })();

我不想对此做太多。也许你给了我们更实质性的东西的精简版。但是,如果您(或读者)认为这些方法总是必要的,我想明确指出它们不是。

于 2013-03-04T16:15:57.377 回答