Как и когда запрашивать «расширенные» объекты в Breeze

У меня есть ViewModel, которая загружает «дочерние» объекты, и я хочу также отображать «внучатые» объекты на основе каждого загруженного дочернего элемента. Чтобы упростить ситуацию, мне нужна помощь в определении того, как запрашивать эти объекты и отображать их в соответствующем «дереве» в браузере (извиняюсь за то, что я разделываю язык кодирования:))

Я использую Knockout для привязки данных и загрузки объектов с помощью Breeze. Этот вопрос является расширением Когда добавлять расширение дополнительные сложные типы в сущности Breeze

Кроме того, моя модель - это сначала код EF, и у меня есть конфигурация, определяющая отношение "один ко многим" между дочерними элементами и внуками, и я думаю, что Бриз уже знает об этом, но я пытаюсь понять, как воспользоваться преимуществами это.

childs.js (модель просмотра)

var childs = ko.observableArray();
var grandChilds = ko.observableArray();
var parentId = ko.observable();

function refresh() {
    var parentId = (parent).parentId;  // << for ex. don't worry about this line : )
    return Q.all([getChildren(), getGrandChildren()]);
}

function getChildren() {
    return datacontext.getChildren(childs, parentId);
}

function getGrandChildren() {
    return datacontext.getGrandChildren(grandChilds);
}

и в представлении (childs.html)

<div data-bind="foreach: childs">
    <div title="Go to Child Details">
        <div><strong data-bind="text: name"></strong></div>
        <div><strong data-bind="text: gender().description"></strong></div>
    </div>
    <div>
        <!-- ko.compose { view: grandChilds} --><!--/ko-->
    </div>
</div>

И мой текущий контекст данных для справки

    var getChilds= function (childsObservable, parentId) {

        var query = EntityQuery.from('Childs')
            .where('parentId', '==', parentId)
            .expand('grandChildren')
            .orderBy('id');

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

        function querySucceeded(data) {
            if (childsObservable) {
                childsObservable(data.results);
            }
            logger.log('Retrieved [Childs] and [Grandchilds] from remote data source', data, system.getModuleId(datacontext), true);
        }
    };

Я хочу загружать только внуков детей, и, поскольку детей много, я хочу отображать внуков только под правильным ребенком, а не всех внуков в одном списке. Любая помощь будет оценена по достоинству.


person PW Kad    schedule 24.04.2013    source источник
comment
В качестве примечания Джей оставил мне примечание по моему другому вопросу, чтобы изучить метод EntityQuery.expand, и я перечитываю его сейчас и почти уверен, что ответ лежит здесь, и я должен был изучить это, прежде чем открывать новый вопрос, но чувствую бесплатно заставить меня чувствовать себя глупо из-за того, что я этого не сделал :)   -  person PW Kad    schedule 24.04.2013


Ответы (1)


У вас есть три основных подхода к запросам и «связыванию» связанных сущностей.

1) Используйте EntityQuery.expand

2) Используйте EntityAspect.loadNavigationProperty

3) Создайте «широкий» EntityQuery, который просто охватывает весь граф, и все отношения родитель/потомок будут автоматически связаны.

person Jay Traband    schedule 24.04.2013
comment
Спасибо, Джей, я совсем забыл о методе расширения. Я смог легко загрузить все объекты и правильно их сопоставить. Это одна из тех вещей, о которых вы не знаете, чего вы не знаете. Breeze делает это настолько простым, что иногда мы ищем устаревшие способы решения простых проблем. - person PW Kad; 24.04.2013