2014-02-11 5 views
1

Я получил это в моих client.js файлПочему в моем приложении Meteor ничего не отображается?

Template.data.champ = Meteor.call("checkLeague", function(error, results) { 
     console.log(results.data.data); 
     return results.data.data; 
}); 

Так он показывает штраф в console.log, но это не на самом деле показать на веб-странице.

Это мой HTML-файл с шаблоном руле

<body> 
    {{> hello}} 
    {{> data}} 
</body> 

<template name="hello"> 
    <h1>Hello World!</h1> 
    {{greeting}} 
    <input type="button" value="Click" /> 
</template> 

<template name="data"> 
    {{#each champ}} 
     {{name}} 
    {{/each}} 
</template> 

Из моего понимания (что очень ограничен в плане рулей), но {{#each CHAMP}} итерацию по объектам? Но по какой-то причине на странице ничего не отображается.

Это структура объекта (отображается в консоли).

Object {Aatrox: Object, Ahri: Object, Akali: Object, Alistar: Object, Amumu: Object…} 
Aatrox: Object 
    id: "Aatrox" 
    image: Object 
    key: "266" 
    name: "Aatrox" 
    title: "the Darkin Blade" 
    __proto__: Object 
Ahri: Object 
Akali: Object 
Alistar: Object 
Amumu: Object 
Anivia: Object 
Annie: Object 
Ashe: Object 

Так что в основном я передаю объект, который имеет свойства, которые имеют значения объектов. Я предполагаю, что {{#each} выполняет итерации по свойствам и дает доступ к значениям (который является объектом), а затем я пытаюсь получить доступ к свойству name этой переменной в шаблоне handlebars, но он не работает.

ответ

1

ответ Peppe правильна - вот вариант для того, как справиться с этой ситуацией:

Template.data.created = function() { 
    Meteor.call('checkLeague', function(error, results) { 
    Session.set('champ', results.data.data); 
    }); 
}; 

Template.data.champ = function() { 
    return Session.get('champ'); 
}; 

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

1

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

Так вместо того, чтобы вы хотите, чтобы ваши данные, как эта

var champ = [{ id: "Aatrox", 
    image: Object, 
    key: "266", 
    name: "Aatrox", 
    title: "the Darkin Blade"}, 
    { id: "Ahri", 
    image: Object, 
    key: "267", 
    name: "Ahri", 
    title: "Hitchhikers Guide"}, ... ]; 

return champ; 

Чтобы получить эту структуру из текущей структуры вам нужно сделать что-то вроде

var champ = []; 

for (var a in results.data.data) { 
    for (var key in results.data.data[a]) { 
     champ.push(results.data.data[a][key]); 
    } 
} 
+1

Как я могу получить такую ​​структуру с моей текущей структурой? Фактически данные поступают из API, возвращающего объект jSON. – Maaz

+0

Только что обновил мой ответ. Я думаю, вам также нужно будет сделать то, что сказал Дэвид Уэлдон. –

1

Я думаю, что проблема может просто, что #each ожидает массив, и вы передаете объект. В вашем помощнике попробуйте return _.toArray(result.data.data);.

Я не мог найти упоминания об этом в документах метеорита, но handlebars.js docs mentions Array. Кроме того, я передал Array раньше, и он работает.

+0

Не работает, к сожалению. – Maaz

+0

Да, я смотрел на возвращение от метода обратного вызова метода и смущал его возвратом от помощника. Ответ Peppe ниже указывает на это, и здесь используется [Meteor.call в помощнике шаблона] (http://stackoverflow.com/a/15186805/728291). – user728291

+1

После того, как другие ответы о проблеме Meteor.call, действительно кажется, что handlebars ожидает массив, поэтому ваш ответ определенно помог. Благодаря! – Maaz

2

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

Если включить функцию обратного вызова в качестве последнего аргумента (который не может быть аргументом для метода, поскольку функции не сериализации), метод будет выполняться асинхронно: он ничего не вернет в и не будет генерировать исключение.

Так любое значение Template.data.champ присваивается, это не «ничего особенного» (обратите внимание на то, что вы вернетесь из обратного вызова вы никогда не будет использоваться в любом месте).

Вы можете хранить его в сессии, как это:

Session.setDefault('theData', []) 

Meteor.call("checkLeague", function(error, results) { 
    Session.set('theData', results.data.data) 
}); 

Template.data.champ = function(){ 
    return Session.get('theData') 
} 

Но я хотел бы попробовать пойти с коллекцией вместо этого.

+1

Что было бы лучшим решением этой проблемы? Поскольку я читал о подопечных, кажется, что результат будет доступен в 'result' и ошибке в' error'. – Maaz

+0

@Maaz Dou! Изменен мой ответ, но Дэвид уже разместил это решение ^^ ' –

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