【问题标题】:Breeze with Knockout computed value is not definedBreeze with Knockout 计算值未定义
【发布时间】:2013-02-01 00:06:50
【问题描述】:

我在 Breeze 中创建计算值并使用 Knockout 绑定到它们时遇到问题。

我正在使用 NoDb 示例项目,可以下载 hereExtending Entities Breeze 文档中的文章是我的主要信息来源。

在 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:参与者名称未定义;绑定值:文本: 参与者姓名

我也注意到,如果我执行这个:

metadataStore.getEntityType('TodoItem');

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

有什么想法吗?

【问题讨论】:

    标签: knockout.js breeze


    【解决方案1】:

    深入研究文档和示例项目,我发现如果服务器不提供任何元数据,则必须手动创建并在客户端中注册。请参阅 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 值。当然,这会让你不得不声明你将要使用的每一个属性。常规操作和绑定可以在没有任何此类代码的情况下工作。

    【讨论】:

    • 是的,Doguhan,Breeze 客户端需要客户端上的元数据,以便从查询中实现实体并在保存期间对其进行序列化。获取元数据最简单的方法是从服务器生成它。但是你必须从某个地方得到它。在您的情况下,为什么您无法从服务器获取它? FWIW,我们正在研究在服务器上生成元数据的方法,而不是从 EF 或 OData 源。
    • @Ward 我对从带有属性的 POCO 对象生成元数据的方法非常感兴趣。我们的数据访问层位于存储库后面,任何 EF 概念都被代码抽象掉了。类似地,实体本身是逐层映射的。所以 Web 项目有它自己的模型类。这是我发现 NoDB 示例非常有用的地方。我可以从我们的存储库中加载数据并将其传递。一开始我很兴奋,因为常规绑定在没有定义完整模型的情况下工作。但这并没有持续多久。
    • 您是否有机会在您的服务器上创建“元数据服务”?我在想你设置你的 POCOS 就好像它们是通过 Code First EF 暴露的一样。你甚至可以滚动一个 DbContext。现在这个 DbContext 不会全部用于数据操作。它的存在仅用于传递给EFContextProvider&lt;&gt;,而EFContextProvider&lt;&gt; 本身仅用于返回有关模型的元数据。通过将其隐藏在“元数据服务”中,您可以确保没有人滥用它。这有意义吗?在我们得到更好的答案之前,我知道这是一种解决方法(hack)。
    • @Ward 我已经实现了一个充分隐藏 DbContext 和 EFContextProvider 的 MetadataService - 我最终会分享我的代码,但在测试项目之外我无法让它工作。听起来与 EF 6 不兼容(抱怨找不到 ObjectContext),并且与 EF 5 出现奇怪错误(未找到服务器 SqlException) - 有什么想法吗?
    • @Ward hm 所以我已将 EF5 问题缩小为在 IIS 和 IIS Express 上运行(在我的测试项目中有效)之间的区别?
    猜你喜欢
    • 1970-01-01
    • 2013-05-03
    • 1970-01-01
    • 2020-08-11
    • 2014-08-03
    • 1970-01-01
    • 2012-11-16
    • 2014-02-21
    • 2021-04-14
    相关资源
    最近更新 更多