2012-04-18 35 views
0

我正在做一個基本上像Facebook牆一樣工作的應用程序。在backbone.js中爲孩子們使用手動ID綁定是否正確

基本上是文章和評論。

它的工作,但爲了呈現評論查看,我用我的帖子模板

<div class="wall-post"> 
    <div class="wall-post-content">${PostContent}</div>   
    <div class="wall-post-comments" id="wall-post-comments-${PostId}"></div> 
</div> 

然後我用註釋區域的ID爲後像這樣類似下面的代碼。

var comment_view = new PostCommentView({ model: post.get("Comments") }); 
this.$('#wall-post-comments-'+ post.get("PostId")).append($(comment_view.render())); 

這有效,但有些東西告訴我,我不應該手動綁定我自己的ID。我覺得我應該用這個聰明的東西做點什麼。

任何人都可以指向正確的方向。

我正在使用BackBone關係來管理關係。

//編輯

按照要求一些實施

//一些功能與點擊去除脣上和功能,因爲我不認爲這涉及到我的問題。

PostModel = Backbone.RelationalModel.extend({ 
urlRoot: '/api/post', 
idAttribute: 'PostId', 
relations: [{ 
    type: Backbone.HasMany, 
    key: 'Comments', 
    relatedModel: 'CommentModel', 
    reverseRelation: { 
     key: 'Post', 
     includeInJSON: 'PostId' 
    } 
}] 
}); 


CommentModel = Backbone.RelationalModel.extend({ 
    urlRoot: '/api/comment', 
    idAttribute: 'PostId' 
}); 


PostCollection = Backbone.Collection.extend({ 
    url: '/api/post', 
    model: PostModel 
}); 


PostListView = Backbone.View.extend({ 
tagName: 'div', 

className: 'PostListView', 

initialize: function(){ 
    _.bindAll(this, 'render', 'render_thread_summary', 'on_submit', 'on_thread_created', 'on_error'); 
    this.model.bind('reset', this.render); 
    this.model.bind('change', this.render); 
    this.model.bind('add', this.render_thread_summary); 
}, 
template: $('#wall-post-template').html(), 

render: function() { 
    $(this.el).html($(this.template).tmpl(this.model.toJSON())); 

    this.model.forEach(this.render_thread_summary); 
    return $(this.el).html(); 
}, 
render_thread_summary: function(post) { 
     var comment_view = new PostCommentView({ model: post.get("Comments") }); 
     this.$('#wall-post-comments-'+ post.get("PostId")).append($(comment_view.render())); 
} 
}); 


PostCommentView = Backbone.View.extend({ 

initialize: function(){ 
    _.bindAll(this, 'render', 'on_click'); 
    this.model.bind('change', this.render); 
}, 

template: $('#wall-comments-template').html(), 
render: function() { 
    var html = $(this.el).html($(this.template).tmpl(this.model.toJSON())); 
    return html; 
} 
}); 
+0

爲了確認,我還沒有真正理解這個。 – 2012-04-18 18:10:07

+0

你可以發佈PostCommentView及其模型的實現嗎? – rtorres 2012-04-18 20:44:27

+0

發表了,感謝您抽出時間:)您可以看到我的代碼基本上來自迄今爲止的骨幹關係教程。 – 2012-04-18 21:46:55

回答

0

我大大利用了this.el引用。沒有必要通常在頁面上使用id的大部分內容,因爲在視圖內,您可以引用$(this.el),然後從頁面的該部分引用。 $(「。className」,this.el)將在頁面上的項目中選擇任何類。 el本質上是對視圖被渲染到的頁面上的區域的引用。一旦你掌握了它,它真的很乾淨。

0

我剛剛開始挖掘到骨幹網(並沒有做過與主幹關係尚未有的話)考慮到這一點,所以這裏是我的2美分:

  • 骨幹定義ID,用於其模型,所以不需要定義你自己的id屬性。如果你檢查模型實例,即使它沒有在你的impl中明確定義,你也會看到它的id。
  • 在我看來,你錯過了由單一評論模型組成的評論集合。然後適當地在視圖中附加模型事件。這樣你就不需要手動管理你的評論視圖渲染(這一切都是由基於事件觸發器的Backbone完成的)。

如果你還沒有看過BB示例Todos應用程序,我會建議給它看看 - 這應該有助於你設計你的評論模型和更好的觀點。

todos.js

todos app - 用火/ ChromeBug檢查代碼

希望這有助於。

+0

嘿。我無法確切地看到這一點,到目前爲止,HTML5數據屬性運行良好。問題是我有時需要操作一些我只有一個鏈接到集合,而不是我正在操作的實例。現在我說這聽起來很愚蠢,所以我會檢查一下。 我使用骨幹關係作爲評論集合,所以這就是爲什麼你沒有看到特定的集合。它由於頂部的關係位而自動創建。得到添加/刪除現在工作,所以推定更新將相當簡單。學習了很多...... – 2012-04-19 21:33:48

+0

是的,不幸的是我對BB關係沒有太多的經驗,但對我來說,你不得不明確地管理模型ID。事實上,如果你看看他們的入門部分(https://github.com/PaulUithol/Backbone-relational#getting-started),你會看到他們定義了一個動物園動物關係,而沒有爲任何一個模型聲明idAttr。同樣可疑的是,在你的代碼中,你的CommentModel和PostModel都有相同的attr id名字。不確定是否正確,但如果它適合你,那麼它可能是好的。無論如何,當你不斷學習,請張貼你的發現。 – rtorres 2012-04-20 01:32:20

+0

對這兩件事物擁有相同的名稱是一個問題,不得不將它切換出來,因爲它在兩者之間變得混亂。這只是我的db模型是所有職位(評論是類型2)。我仍然在這裏和那裏放了幾個ID,但是我會根據需要進行重構。真的想要起牀和運行,並考慮它做了什麼我做了什麼代碼,我總體上非常高興! – 2012-04-21 02:15:10

相關問題