解决了!这是一个Knockout问题(错误的绑定)。但也许有人喜欢对代码进行争论或评论(dataservice,viewmodel等)。
我尝试构建一个Breeze示例,在其中我获取一个数据库记录(使用 fetchEntityByKey ),显示它以进行更新,然后使用保存按钮将更改写回数据库。我无法弄清楚如何让它发挥作用。
我尝试使用 dataservice ('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);
});
答案 0 :(得分:0)
fetchEntityByKey
的调用将隐式为您执行此操作,因为正如您所说的那样,它将始终转到服务器。
此外,最好在dataservice中的失败回调中重新抛出错误,以便调用者(例如,ViewModel)可以添加自己的失败处理程序。如果没有重新抛出,调用者的失败回调就听不到它(Q promise机器就好像第一个失败处理程序“解决”了这个问题)。
因此,您的数据服务可以简化为:
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 }) } })();
我不想做太多。也许你给我们一些更实质的精简版。但是,如果你(或读者)认为这些方法总是必要的,我想表明它们不是。