1

我听说过很多关于 Backbone 的信息,并想在我的最新项目中使用它来学习它。但是,我来自 Rails 背景,我的经验似乎不适用于 Backbone。

例如,我有四个模型需要在产品视图中显示。

class Product < ActiveRecord::Base
  belongs_to :category
  belongs_to :child
  has_many :actions
  has_many :comments
end

class Child < ActiveRecord::Base
  belongs_to :user
  has_many :products
end

我正在使用 Backbone-relational 来定义 Backbone 模型中的关系。以下是产品 Backbone 模型。

class Ibabybox.Models.Product extends Backbone.RelationalModel
  paramRoot: 'product'
  urlRoot: '/products'

  relations: 
    [
      {
        type: Backbone.HasMany
        key: 'actions'
        relatedModel: 'Ibabybox.Models.Action'
        collectionType: 'Ibabybox.Collections.ActionsCollection'
        reverseRelation:
          key: 'product'
          includeInJSON: 'id'
      } 
    ]

在主干路由器中,我执行以下操作。

类 Ibabybox.Routers.ProductsRou​​ter 扩展 Backbone.Router

routes:
"": "index"
":id": "show"

show: (id) ->
  @product = new Ibabybox.Models.Product({id: id})
  @product.fetch
    success: (product) ->
      actions = product.get('actions')
      child = product.get('child')
      @child_model = new Ibabybox.Models.Child({id: child.id})
      user = @child_model.get('user')
      @view = new Ibabybox.Views.Products.ShowView({model: product, actions: actions, child: child, user: user})
      $("#products").html(@view.render().el)

在 Rails 控制器上,我执行以下操作。

class ProductsController < ApplicationController
  def show
    @product = Product.find(params[:id])
    render json: @product.to_json(:include => [ :actions, 
                                            :child => { :include => {:user => {:methods => [:name] }}} ])
  end
end

首先,我是否朝着正确的方向前进?

其次,感觉需要定义和编写很多东西来显示产品的相关内容以及感觉我可能做错了什么的原因......

任何帮助/建议/更正将不胜感激!

谢谢!

4

1 回答 1

1

根据backbone.js doc There's More Not One Way To Do It,但是当你的应用程序增长时,有些方法会变得很痛苦。在使用backbone.js 和rails 开发了3 个应用程序之后,这是我的经验。

  1. 主干.js 并不适合每个网站。特别是如果您的网站是基于内容的。在这种情况下,使用 pjax 可以获得更好的结果。

  2. 基于资源的设计是最好的方法。希望rails和backbone.js都能发挥作用。您可以轻松使用默认的 Rails 生成器,只需进行最少的更改。对于复杂的对象,我更喜欢使用jbuilder,因为我可以缓存对象。

  3. 如果你使用显式 $.ajax,$.post,$.get 可能你错了。[same as 2]

  4. 如果你在重复自己,那就有问题了。

  5. 不要错过主干事件。(在您的情况下,您可以使用事件而不是传递成功回调来获取)

于 2012-12-13T08:14:39.067 回答