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 и оттачивал свои навыки решения проблем. Основным уроком здесь является то, что при попытке решить проблему мне нужно упростить... упростить... упростить...

Другие вопросы по тегам