我在Breeze中创建计算值并使用Knockout绑定它们时遇到了麻烦。
我正在使用NoDb示例项目,可以下载here,而Breeze文档中的Extending Entities文章是我的主要信息来源。
在todo.datacontext.js文件中,我做了以下更改:(我已经包含了第一行和最后一行,以指导我确切放置代码的位置)
...
configureManagerToSaveModifiedItemImmediately();
metadataStore.registerEntityTypeCtor('TodoItem', function () { }, todoItemInitializer);
function todoItemInitializer(todoItem) {
todoItem.participantName = ko.computed(function () {
return 'John' + ' ' + 'Smith';
});
};
var datacontext = {
...
在Index.html中,我补充道:
...
<ul data-bind="foreach: todos">
<li>
<p data-bind="text: participantName" />
<input type="checkbox" data-bind="checked: isDone" />
...
但是,我收到了这个错误:
检索待办事项列表时出错:无法解析绑定。信息: ReferenceError:未定义participantName;绑定值:文字: participantName
我也注意到,如果我执行此操作:
metadataStore.getEntityType('TodoItem');
它告诉我这种类型不存在,即使我正在注册它。
有什么想法吗?
答案 0 :(得分:0)
深入研究文档和示例项目,我发现如果服务器不提供任何元数据,则必须手动创建并在客户端注册。请参阅todo.model.js。以下是代码中最相关的部分:
var et = new EntityType({
shortName: "TodoItem",
namespace: "NoDb.Models",
autoGeneratedKeyType: AutoGeneratedKeyType.Identity
});
...
store.addEntityType(et);
store.registerEntityTypeCtor("TodoItem", null, todoItemInitializer);
然后初始化程序按预期工作,并正确识别ko.computed值。当然,这会让你不得不声明你将要使用的每一个属性。常规操作和绑定在没有任何此代码的情况下工作。