SPA Using BreezeJS, Durandal and Knockout: No getProperty me

本文关键字:No getProperty me Knockout and Using BreezeJS Durandal SPA | 更新日期: 2023-09-27 18:34:45

我正在使用基于 SPA 的应用程序作为概念验证,但遇到了问题。

我的SPA正在使用BreezeJS,Durandal,Knockout和WebApi。对于数据访问层,我以代码优先方法使用实体框架 5。

我有两个类,如下所示:

public class TodoList : IEntity
{
    public TodoList()
    {}
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<TodoItem> Items { get; set; }
}
public class TodoItem : IEntity
{
    public int Id { get; set; }
    public string Description { get; set; }
    public DateTime? DueDate { get; set; }
    public TodoList TodoList { get; set; }
    public int? TodoListId { get; set; }
}

然后在我的 Web 项目中,我创建了一个视图和视图模型来列出所有 TodoLists(视图模型如下 - 我已经将代码压缩到这个视图模型中,因为我实际上使用的是 BreezeJS 网站上示例的存储库和工作单元模式(:

define(['services/entitymanagerprovider', 'plugins/router'],
    function (entitymanagerprovider, router) {
    var todoLists = ko.observableArray();
    var provider = entitymanagerprovider.create();
    var manager = provider.manager();
    function activate() {
        var entityTypeName = "TodoList";
        var resourceName = "data/TodoLists";
        if (entityTypeName) {
            entityType = manager.metadataStore.getEntityType(entityTypeName);
            entityType.setProperties({ defaultResourceName: resourceName });
            manager.metadataStore.setEntityTypeForResourceName(resourceName, entityTypeName);
        }
        var query = breeze.EntityQuery
                        .from(resourceName);
        manager.executeQuery(query)
             .then(function (data) {
                return todoLists(data.results);
             })
             .fail(function(error) {
                console.log(error);
             });
    }
    return {
        activate: activate,
        todoLists: todoLists
    };
});

但是,当我运行该页面时,出现以下错误:

对象 # 没有方法 'getProperty'

我已经调查了错误,它发生在 BreezeJS 代码中。 我相信我的一个实体没有被实体类型包装,这意味着无法调用"getProperty"函数......虽然这只是一个非常粗略的猜测!

我已经在数据访问代码中检查了两个对象之间的关系,并在子对象 (TodoItem( 上公开了外键和父对象。

顺便说一句,我实际上有另一个使用与上面相同的技术的SPA原型,但它使用的是以前版本的BreezeJS和Durandal。 另一个 SPA 有效,但是当我使用我目前正在处理的 SPA 时出现错误。 我目前使用的版本是:

BreezeJS: 1.4.2 (元数据版本 1.0.5(

杜兰达尔:2.0.0

任何帮助将不胜感激! 谢谢。

SPA Using BreezeJS, Durandal and Knockout: No getProperty me

在断断续续地看了几天问题后,我设法解决了它。 首先,我应该声明问题是由我犯了一个非常基本的错误引起的。 我通过简化问题并按照此SO帖子中概述的步骤获得了解决方案:

我收到的最初错误是:

对象 # 没有方法 'getProperty'

我收到这个是因为 Breeze 无法将我的查询结果映射到实体类型。 因此,我的实体没有被Breeze包装,因此无法访问"getProperty"功能。

因此,为了解决这个问题,我尽可能地简化了(正如 Ward 在帖子中所建议的那样(,在消除了很多复杂性之后,我意识到我的 WebApi 调用没有返回 Breeze 将我的查询结果映射到实体类型所需的类型信息(例如,我的 JSON 结果如下(:

[
    {
    Id: 1,
    Name: "List 1"
    },
    {
    Id: 2,
    Name: "List 2"
    }
]

当我看到这个时,我意识到我会犯一个非常基本的错误,问题是我的 WebApi 控制器上缺少 [BreezeController] 属性。 因此,当我按如下方式更新控制器时:

[BreezeController]
public class DataController : ApiController

然后,JSON 有效负载变为:

[
    {
    $id: "1",
    $type: "SJCNet.Todo.Model.TodoList, SJCNet.Todo.Model",
    Id: 1,
    Name: "List 1"
    },
    {
    $id: "2",
    $type: "SJCNet.Todo.Model.TodoList, SJCNet.Todo.Model",
    Id: 2,
    Name: "List 2"
    }
]

然后一切都按预期工作。

所以,简而言之,这是我犯的一个非常基本的错误。 但是在试图弄清楚这个问题的同时,我学到了很多关于微风的知识,并磨练了我解决问题的能力。 这里的主要教训是,当试图解决问题时,我需要简化......简化。。。简化。。。