如何在Backbone的eco模板中使用自定义模型功能?

时间:2013-01-08 15:59:42

标签: javascript jquery ruby-on-rails backbone.js

模型

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' 

1 个答案:

答案 0 :(得分:0)

从您的代码看起来,您希望FeedItemView处理FeedItem类型的模型,因为您调用model.isPost()上定义的方法FeedItem 。 Eco无法找到的方法在Post模型上定义,因此从逻辑上讲,其中一个方法将失败。

您的意思是从Post延长FeedItem吗?在这种情况下,而不是:

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

您应该声明模型:

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