#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 Не беспокойтесь. На самом деле это не ждет. Первоначально он возвращает «» (ничего), и как только данные поступают, он заполняет их, поскольку он реагирует на новые данные без дополнительного кода