SPA Использование BreezeJS, Durandal и Knockout: метод getProperty отсутствует
Я работаю на основе приложения SPA в качестве доказательства концепции и у меня есть проблема.
Мой SPA использует BreezeJS, Durandal, Knockout и WebApi. Для слоя доступа к данным я использую Entity Framework 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; }
}
Затем в моем веб-проекте я создал представление и модель представления, чтобы вывести список всех списков TodoList (модель представления выглядит следующим образом - я сжал код в этой модели представления, поскольку я на самом деле использую шаблоны репозитория и unitofwork из примеров на 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. Я считаю, что одна из моих сущностей не заключена в EntityType, что означает, что функция 'getProperty' не может быть вызвана... Хотя это только очень грубое предположение!
Я проверил отношения между двумя объектами в моем коде доступа к данным, и я выставил внешние ключи и родительский объект на дочернем объекте (TodoItem).
Кроме того, у меня есть еще один прототип SPA, использующий те же методы, что и выше, но он использует предыдущие версии BreezeJS и Durandal. Другой SPA работает, но я получаю ошибку, когда использую SPA, над которым я сейчас работаю. Версии, которые я сейчас использую:
BreezeJS: 1.4.2 (метаданные версии 1.0.5)
Дюрандаль: 2.0.0
Любая помощь будет высоко ценится! Благодарю.
1 ответ
Посмотрев на проблему в течение нескольких дней, мне удалось ее решить. Во-первых, я должен заявить, что проблема была вызвана тем, что я сделал очень основную ошибку. Я нашел решение, упростив задачу и выполнив действия, описанные в этом сообщении:
Первоначальная ошибка, которую я получал, была:
У объекта # нет метода getProperty
Я получил это, потому что Бриз не смог отобразить результаты моего запроса на тип объекта. Поэтому мои сущности не были обернуты Breeze и поэтому не имели доступа к функции 'getProperty'.
Итак, чтобы исправить это, я упростила все, что могла (как предложено в публикации Ward), и после устранения многих сложностей я поняла, что мои вызовы WebApi не возвращают информацию о типе, необходимую Breeze для сопоставления моего запроса результаты для типа объекта (например, мой результат JSON был следующим):
[
{
Id: 1,
Name: "List 1"
},
{
Id: 2,
Name: "List 2"
}
]
Когда я увидел это, я понял, что совершил бы действительно базовую ошибку, и проблема была в том, что мне не хватало атрибута [BreezeController] на моем контроллере WebApi. Поэтому, когда я обновил свой контроллер следующим образом:
[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"
}
]
Тогда все заработало как положено.
Короче говоря, это была очень простая ошибка, которую я сделал. Но, пытаясь понять это, я многое узнал о Breeze и оттачивал свои навыки решения проблем. Основным уроком здесь является то, что при попытке решить проблему мне нужно упростить... упростить... упростить...