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
任何帮助将不胜感激! 谢谢。
在断断续续地看了几天问题后,我设法解决了它。 首先,我应该声明问题是由我犯了一个非常基本的错误引起的。 我通过简化问题并按照此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"
}
]
然后一切都按预期工作。
所以,简而言之,这是我犯的一个非常基本的错误。 但是在试图弄清楚这个问题的同时,我学到了很多关于微风的知识,并磨练了我解决问题的能力。 这里的主要教训是,当试图解决问题时,我需要简化......简化。。。简化。。。