не мог показать список документов в представлении с помощью derbyjs

Это мой первый раз с derbyjs, не знаю, то ли я тупой, то ли это отсутствие документации. у меня есть модель под названием «книги», и я просто пытаюсь показать список книг.

вот мой код:

module.exports = {
    properties: {
        title: {type: 'string', minLength: 6},
        author: {type: 'integer', minimum: 0},
        image: {type: 'string'},
        status: {type: 'integer', minimum: 0, maximum: 1}, // 1 read, 0 wants to read
        comment: {type: 'string'}
    },
    required: ['title']
}

и список схем

module.exports = {
    schemas: {
        auths: require('./model/auths'),
        products: require('./model/products'),
        books: require('./model/books')
    }
}

индекс js

app.get('/shelf', function(page, model, params, next){
    model.subscribe('books', function(){
        var book = model.at('books.669374b5-8470-4f3a-a25f-0995a5a92a7a');
        model.ref('_page.book', book);
        page.render('home');
    });
});

я ожидаю, что в представлении будут "книги", поэтому я написал {{каждый}} вот так

{{ each books as #b}}
    {{ #b.title }}
{{/each}}

но ничего не появляется, хотя это отлично работает и отображается так, как ожидалось

{{ _page.book.title }}

также в веб-консоли это работает нормально и показывает 3 книги

app.model.get('books')

уведомление: я добавил книги через веб-консоль, примерно так

app.model.add('books', {title: 'something'})

внутри функции подписки я попытался

var books = model.get('books');
model.ref('_page.books', books);

но вылезает ошибка

Любая идея, что я делаю неправильно? я очень люблю дерби, но это сдерживает меня на несколько дней


person shehata    schedule 10.12.2014    source источник


Ответы (1)


Если вы хотите, чтобы страница обновлялась автоматически, вы должны использовать ref вместо get(), например.

app.get('/shelf', function(page, model, params, next) {
  var booksQuery = model.query('books', {});
  model.subscribe(booksQuery, function(err) {
    booksQuery.ref('_page.books');
    page.render('books');
  });
});

Шаблон:

{{ each _page.books as #b}}
  {{ #b.title }}
{{/each}

В дополнение к официальной документации по Дерби я нашел derby-faq. быть хорошим ресурсом.

person Kyle Finley    schedule 10.12.2014
comment
Чтобы объяснить это немного больше, books — это коллекция, а коллекции представлены в модели как объекты. В шаблонах Derby блоки {{each}} могут выполнять итерацию только по массивам, но не по объектам. Как указал Кайл, вы можете использовать refList для создания массива документов в коллекции, соответствующей результатам запроса. Кроме того, вы можете использовать model.filter для сопоставления коллекции с массивом. - person Nate Smith; 11.12.2014
comment
что я хотел бы спросить, мне всегда нужно использовать подписку, прежде чем использовать model.get()? потому что первый способ в ответе у меня не сработал, а второй работает нормально. - person shehata; 12.12.2014
comment
Да, вы должны использовать подписку для заполнения модели. Спасибо, что сообщили мне об ошибке, я удалил ее, чтобы другие не путались. - person Kyle Finley; 12.12.2014