2014-02-11 111 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,但它實際上並沒有顯示在網頁上。

這是車把模板

<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冠軍}}在物體迭代我的HTML文件?但由於某種原因,頁面上沒有顯示任何內容。

這是對象結構(顯示在控制檯中)。

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}遍歷屬性並賦予對這些值的訪問權限(這是一個對象),然後嘗試訪問handlebars模板中該變量的name屬性,但它不起作用。

回答

1

佩普的答案是正確的 - 這裏是如何處理這種情況的一個選項:

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

我該如何獲得這種結構與我目前的結構?數據實際上來自返回jSON對象的API。 – Maaz

+0

剛剛更新了我的答案。我想你還需要做大衛·韋爾登所說的話。 –

1

我認爲這個問題可能只是#each期待一個數組,並且你正在傳遞一個對象。在你的幫手中,試試return _.toArray(result.data.data);

我在流星文檔中找不到任何提及,但是handlebars.js docs mentions 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!改變了我的答案,但大衛已經發布瞭解決方案^^' –

相關問題