2014-02-14 3 views
0

При попытке визуализации моего шаблона я хочу загрузить данные с сервера. Я пытаюсь использовать Meteor.call, но, согласно документации, я явно не в заглушке.Загрузить данные с помощью Meteor.call при загрузке

Если я использую Meteor.call внутри обработчика событий, ответ, который я верну, верен. Если я назову его в template.created или подобном, я получаю неопределенный ответ. Думаю, я мог бы использовать асинхронный вызов, чтобы сделать это, а затем отобразить его, когда он доступен. Но есть ли другой путь?

Я не хочу, чтобы у клиентов был прямой доступ к БД, я хочу, чтобы он пришел с сервера.

//This doesn't work 
    Template.config.created = function() { 
    console.log(Meteor.call('getValue')); //returns undefined 
    }; 

    //This works 
    Template.config.events({ 
    'blur #button' : function() { 
     console.log(Meteor.call('getValue')); //Prints value 
    } 

Любые подсказки?

D

+0

Еще одно замечание, что в клиентах Метеор никогда не имеют прямого доступа к БД, даже при использовании на стороне клиента DB API. Все запросы будут проверяться в соответствии с указанными вами правилами allow/deny. Это дает вам полный контроль ACL над запросами, которые клиент может запускать. По крайней мере, вы должны определить дескрипторы методов на клиенте, чтобы он мог компенсировать латентность, что делает ваше приложение менее вялым по сравнению с ожиданием ответов на серверные методы. – sbking

+0

Добавление в Cuberto - по умолчанию Meteor имеет автообновление и небезопасное включение, которое публикует все данные для всех клиентов и позволяет клиенту получить полный доступ. Вы можете отключить их, используя $ meteor remove <имя_пакета> и опубликовать/подписаться на данные, которые вам нужны. Вот довольно приличная статья: http://andrewscala.com/meteor/ – hharnisc

+0

Два ответа ниже. Так что сделайте разъяснения выше. –

ответ

2

Вы должны использовать функцию обратного вызова в вашем Meteor.call

Template.config.created = function() { 
    Meteor.call('getValue', function(error, data) { 
     if(error){ 
      //do stuff to handle error 
     } 
     console.log(data); 
    }); 
}; 
+0

Спасибо за четкий ответ. Должен ли я настраивать реактивность, чтобы после завершения вызова он обновил шаблон? –

+1

Это обычно то, что было бы сделано. Самым простым и наиболее распространенным способом было бы просто выполнить 'Session.set()' в обратном вызове и 'Session.get()' в вспомогательной функции шаблона. – sbking

+1

Я бы рекомендовал установить помощник шаблона, который возвращает коллекцию (которая по умолчанию является реактивной) https://www.discovermeteor.com/blog/a-look-at-a-meteor-template/ - см. Раздел о «Помощники шаблонов». В противном случае использование сеанса (предложение Cuberto будет работать для вас) – hharnisc

2

Из документов:

на клиенте, если вы не передаете обратный вызов, и вы не внутри заглушки, call вернет undefined, и у Вас не будет никакого способа получить возвращаемое значение метода. Это потому, что у клиента нет волокон, поэтому на самом деле он не может блокировать удаленное выполнение метода.

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

+0

Спасибо, я был толстым. Понятно, что нужно некоторое время вдали от экрана! –

Смежные вопросы