2013-01-08 33 views
1

模式如何在Backbone的生態模板中使用自定義模型功能?

Network.Models.FeedItem = Backbone.Model.extend({ 
    isPost: function() { 
    return this.get('template') === 'post'; 
    } 
}) 

Network.Models.Post = Backbone.Model.extend({ 
    urlRoot: '/p', 

    hasImageInDetails: function() { 
    if(this.get('details').match(/<img[^<]*>[\w\d]*<\/img>|<img[^\/]*\/>/i)) { 
     return true 
    } 
    } 
)} 

模板 feed_items/post.jst.eco

<% if @model.hasImageInDetails(): %> 
    has image 
    <% end %> 

查看

Network.Views.FeedItemView = Backbone.View.extend({ 
    initialize: function() { 
    var self = this; 
    this.template = JST[this.path()]; 
    }, 

    render: function() { 
    var self = this; 
    $(this.el).html(this.template({ model: this.model })); 

    if (this.model.isPost()) { 
     this.questionView = new Network.Views.FeedItems.Post({ 
     model: this.model, 
     el: this.$el, 
     parent: this 
     }); 
    } 
    } 
}); 

Network.Views.FeedItems.Post = Backbone.View.extend({ 
    initialize: function() { 
    this.render(); 
    }, 

    render: function() { 
    var self = this; 
    } 
}); 

但我得到一個錯誤:

Uncaught TypeError: Object [object Object] has no method 'hasImageInDetails' 
+0

你能還包括調用'eco.render'的方法的代碼?它看起來像模板中的@ model'變量可能不是Backbone Model實例。 – jevakallio

+0

當然我包括郵政視圖 – tomekfranek

+0

我沒有看到該示例中的任何位置呈現模板。它可能在'TagsRoot'視圖中被調用? – jevakallio

回答

0

它看起來像從你的代碼,您所期望的FeedItemView處理FeedItem類型的模型,因爲你調用一個方法model.isPost(),這是對FeedItem定義。 Eco找不到的方法在Post模型上定義,因此在邏輯上,其中一個將失敗。

您是否想要從FeedItem延長Post?在這種情況下,代替:

Network.Models.Post = Backbone.Model.extend({ ... }); 

你應該申報模式,使:

Network.Models.Post = Network.Models.FeedItem.extend({ ... }); 
+0

好吧,我改變了模型聲明,你在上面寫,並已定義在Post模型中'hasImageInDetails''方法,但在post.jst.eco模板中仍然有相同的錯誤 – tomekfranek

+0

您是否還將'FeedItem's傳遞到'FeedItemView '?你的代碼會這樣建議。任何沒有定義(或繼承)方法的模型在傳入'FeedItemView'時都會導致該異常,因爲它沒有方法調用。我認爲這是問題。否則你的模板看起來很好。祝你好運! – jevakallio

相關問題