没有定义具有Knockout计算值的Breeze

时间:2013-02-15 22:31:45

标签: knockout.js breeze

我在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');

它告诉我这种类型不存在,即使我正在注册它。

有什么想法吗?

1 个答案:

答案 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值。当然,这会让你不得不声明你将要使用的每一个属性。常规操作和绑定在没有任何此代码的情况下工作。