Отображение связанных документов в Meteor только с идентификатором

#javascript #meteor #meteor-blaze

#javascript #meteor #meteor-blaze

Вопрос:

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

Предположим, что-то вроде этого:

 //ResourceOne { name: "foobar" } ... ResourceTwo { name: "donuts" }
Resources = new Meteor.Collection('resources');

//{ input: ResourceOneID, output: ResourceTwoID }
Connections = new Meteor.Collection('connections');
 

Соединения соединяют ресурсы с другими ресурсами, сохраняя только их _id имена.

Я хочу отобразить список подключений в форме

 foobar --> donuts
 

Как мне это сделать?

Прямо сейчас у меня есть:

 {{#each connections}}
    <a href="#">{{ input_name }} --> {{ output_name }}</a>
{{/each}}
 

Который работает от помощника шаблона:

 input_name: function() {
    return Resources.find( { _id: this.input } ).fetch()[0].name;
}
 

Это работает, но сбой происходит всякий раз, когда страница обновляется не полностью.

Какой лучший способ сделать это?

Ответ №1:

Вероятно, это происходит потому, что вы не ждете полного поступления данных. Когда вы запускаете это

 Resources.find( { _id: this.input } ).fetch()[0].name;
 

Вы предполагаете, что Resoureces.find(..).fetch()[0] это приведет к результату, но так будет не всегда. Когда ваша страница загружается изначально , данные , возможно , еще не поступили в браузер , и результат будет null следующим . Если вы проверите name атрибут, он выдаст исключение.

Вам просто нужно обработать этот случай, чтобы он работал:

 var resource = Resources.findOne( { _id: this.input } );
return resource amp;amp; resource.name;
 

Примечание: findOne() совпадает с .fetch()[0] .

Итак, here resource возвращает null значение, равное нулю, и не проверяет его name атрибут.

Комментарии:

1. ЭТО ПОХОЖЕ НА ВОЛШЕБСТВО. Большое спасибо! Вы не возражаете, если я спрошу: я понимаю идиому в операторе return, но что заставляет систему «ждать» resource.name чтобы иметь значение? Т.е. откуда мы знаем resource.name , что оно не будет равно null, когда оно будет возвращено?

2. Кстати, я пытался проголосовать, но у меня пока недостаточно очков репутации… дайте мне знать, если есть какой-либо другой способ, которым я могу компенсировать. Это на некоторое ВРЕМЯ поставило меня в тупик.

3. @m52go Не беспокойтесь. На самом деле это не ждет. Первоначально он возвращает «» (ничего), и как только данные поступают, он заполняет их, поскольку он реагирует на новые данные без дополнительного кода