2013-01-08 31 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

相关问题