2011-09-08 31 views
1

我使用PHP後端,Backbone.js和Handlebars.js。我的JavaScript數據請求和JSON數據成功返回(json_encode)。Handlebars.js不喜歡在前面的方括號

當我給這個JSON數據到車把模板,它不顯示。我意識到在我的JSON對象的前面和後面的方括號被Handlebars.js'不喜歡',並且不被顯示。看看下面的代碼。

var ArticleListView = Backbone.View.extend(
{ 
    el: $('#main'), 
    render: function() 
    { 
    var template = Handlebars.compile($("#articles_hb").html()); 
    $(this.el).html(template([{"articles":[{"title" : "1"}, {"title" : "2"}]}])); 
    return this;  
    } 
}); 

現在,如果我拿出方括號,它工作正常。這是怎麼回事?爲什麼方括號首先在那裏?我如何擺脫它們?

回答

0

Handlebars希望爲上下文對象,因爲它使用的背景下,作爲模板值簡單的查找表。所以你需要傳遞一個對象({ ... })到template(),而不是一個數組([ ... ])。

有人給你一個包含你需要的上下文對象的元素數組。或者修復正在產生JSON發送JSONified對象(在PHP術語關聯數組),而不陣列包裝或剝離在客戶端代碼的陣列的是這樣的PHP:

$(this.el).html(template(context[0])); 

如果有此文字代碼:

$(this.el).html(template([{"articles":[{"title" : "1"}, {"title" : "2"}]}])); 

在您的JavaScript文件中,那麼您必須生成該代碼並修復它。如果你確實有像嵌入在你的Backbone視圖那樣的文字數據,那麼你可能沒有正確使用Backbone,你的模板的數據可能應該來自Backbone模型。

如果你從骨幹模型中獲得JSON,那麼我猜你在調用toJSON的集合(它返回一個數組),而不是一個模型,其中toJSON應該給你一個JavaScript對象。

+0

謝謝您的回答。這有很大幫助。在你的最後一段中,你說過,「在集合上調用jSON()將返回一個數組。如果是這種情況,如果我想將該集合傳遞給handlebars模板,我會再次使用同一個方括號嗎? – ericbae

+2

@ebae :你需要給這個數組一個名字,'template({stuff:stuffs.toJSON()})'。 –

+0

cool。btw。我是否正確地做?時間?我見過的其他教程和示例不這樣做所以我在做什麼不同? – ericbae

4

調用Handlebar循環集合的輸出是完全合理的。 另外一個數組並不是一個糟糕的設計決策,用於視圖中的數據處理。

把手具有用於處理數字或符號標識,as described here一種特殊的語法。所以,更正確的答案是,把手可以訪問陣列模板是這樣的:

{{people.attributes.[0]}} // akin to people.attributes[0] 
{{people.attributes.[1]}} // akin to people.attributes[1] 

輸入:郵件:[{頭:{主題:「你好親愛的」,「......另一個」]}} ,...更多]

<ul> 
    {{#each mails}} 
    <li>. 
     {{headers.subject.[0]}} 
    </li> 
    {{/each}} 
</ul>