Breeze js, не относящийся к EF, имеет серверные метаданные

Я запускаю следующее, используя Breeze.js с Asp.Net WebAPI. Я могу запросить свою службу, используя протокол OData, и я вижу данные JSON в ответе, но обратные вызовы .then() и .fail() не срабатывают, поэтому модель представления никогда не получает данные. Это потому, что мне не хватает метаданных?

/// <reference path="..\breeze.debug.js" />

(function (root) {
    var dataService = new breeze.DataService({
        serviceName: 'api/breezesample',
        hasServerMetadata: false
    });

    var altMs = new breeze.MetadataStore({
        namingConvention: breeze.NamingConvention.camelCase
    });

    var manager = new breeze.EntityManager({
        dataService: dataService,
        metadataStore: altMs
    });

    // define the viewmodel
    var vm = {
        todos: ko.observableArray(),
        includeDone: ko.observable(false),
        show: ko.observable(false)
    };

    // start fetching Todos
    getTodos();

    // re-query when "includeDone" checkbox changes
    //vm.includeDone.subscribe(getTodos);

    // bind view to the viewmodel
    ko.applyBindings(vm);

    /* Private functions */

    // get Todos asynchronously
    // returning a promise to wait for     
    function getTodos() {

        var query = breeze.entityModel.EntityQuery.from("todos");

        if (!vm.includeDone()) {
            query = query.where("IsDone", "==", false);
        }

        return manager
            .executeQuery(query)
            .then(querySucceeded)
            .fail(queryFailed);
    };

    function querySucceeded(data) {
        vm.todos.removeAll();

        var todos = data.results;
        todos.forEach(function (todo) {
            vm.todos.push(todo);
        });

        vm.show(true); // show the view
    }

    function queryFailed(error) {
        alert("Query failed: " + error.message);
    }

}(window));

person Justin Henriksen    schedule 20.12.2012    source источник


Ответы (1)


Попробуйте этот код. Вам также нужно будет добавить свои метаданные в «altMs» через вызовы метода addEntityType. Убедитесь, что у вас установлена ​​последняя версия breeze, v.0.78.x. «breeze.entityModel» в вашем коде больше не нужен.

var DataService   = breeze.DataService;
var MetadataStore = breeze.MetadataStore;
var EntityManager = breeze.EntityManager;

var dataService = new DataService({
    serviceName: altServiceName,
    hasServerMetadata: false
});

var altMs = new MetadataStore({
    namingConvention: NamingConvention.camelCase
});

return new EntityManager({
    dataService: dataService,
    metadataStore: altMs
});
person Jay Traband    schedule 20.12.2012
comment
Я использую версию 0.78.2, которую вчера вытащил из NuGet. Что делать, если я не знаю или не имею доступа к метаданным? В идеале я хотел бы использовать Breeze для запроса любой веб-службы, поддерживающей протокол OData, без добавления метаданных в мой код. Это возможно? @john-papa сделал аналогичный запрос на пример в этой теме ссылка, поэтому я предположил, что это возможно. - person Justin Henriksen; 20.12.2012
comment
Да, вы можете использовать приведенный выше код. Но без метаданных результаты не добавляются в EntityManager и не обертываются как «наблюдаемые» объекты. Результаты запроса для типов без метаданных — это просто объекты Java. - person Jay Traband; 20.12.2012
comment
Спасибо, Джей. Теперь я не получаю сообщение об ошибке, и я вижу, что данные JSON возвращаются из моей веб-службы, но .then(обратный вызов) и .fail(обратный вызов) никогда не срабатывают. Есть идеи? Я включил весь свой исходный код выше. - person Justin Henriksen; 21.12.2012
comment
Можете ли вы опубликовать небольшой пример того, как выглядит ваш метод getTodos? - person Jay Traband; 21.12.2012
comment
Джей - я обновил исходный вопрос, добавив больше кода. См. выше. - person Justin Henriksen; 21.12.2012
comment
Я не могу воспроизвести вашу проблему, но... теперь в образцах breeze v 0.82.1 доступен пример, отличный от EF. называется ToDo-NoEF - person Jay Traband; 04.01.2013