在backbone.js中使用自定义元属性实例化Rails模型

时间:2012-08-14 07:41:54

标签: backbone.js ruby-on-rails-3.2

我想在Backbone视图中创建基于Rails模型的表单字段以及Rails模型验证,而不需要模板。为了实现这一点,我使用了JBuilder,如:

1 json.(@recipient, :firstName,
2       :lastName,
3       :street1,
4       :street2,
5       :city,
6       :state,
7       :zip,
8       :phone1,
9       :phone2)
10 json.required Recipient.validators[0].attributes
11 json.fields Recipient.accessible_attributes.reject {|x| x==""}
12 json.states [ 
13               ['Alabama', 'AL'],
14               ['Alaska', 'AK'],
15               ['Arizona', 'AZ'],
16               ['Arkansas', 'AR'],
                 ...
64               ['Wyoming', 'WY']
65             ]

我相信你可以看到我要去哪里......

因此,目标是迭代字段并将DOM输入附加到DOM,相应地为model.required数组设置样式。当然,states字段可以动态地为选择状态选择插入选项。验证肯定只是由服务器响应错误执行(不是真的关心在客户端上做,但我想我可以)只需读取错误响应。

所以问题,我想是:

1)我是否只是在View构造函数中实例化Backbone模型?

2)你会这样做:

this.model.fetch({url:'/recipients/new', 
  success:function(index,model)
   {
     this.model = model.responseText
   }
});

更好的方法吗? 我确实看到powmedia/backbone-forms虽然对我来说似乎是双重工作以及我必须解决的其他事情,当然,我必须在客户端重新定义所有内容。

如果没有更多的话,至少这会成为其他有相同想法的人的参考点(我找不到任何相关内容)

可能的解决方案?

coffescript:

1 class Senditbacklater.Models.Recipient extends Backbone.Model
2   
3   url: '/recipients'
4   
5   initialize: ->
6     $.getJSON('/recipients/new', (data) =>
7       $.each(data, (key,val) =>
8         obj = {}
9         obj[key] = val
10         this.set(obj)
11       ) 
12     ) 

然后我应该好好去创建视图渲染中的表单

1 个答案:

答案 0 :(得分:0)

您的情况并不特别,在改变您的观点时您唯一需要做的事情是:您只需要处理从服务器提取Model呈现View

渲染非常复杂,这是真的,你必须使用你的View代码来解决它。

您可以尝试这样的事情:

// code simplified and no tested
var MyForm = Backbone.Model.extend({
  url: "/recipients/new"
});

var MyFormView = Backbone.View.extend({
  initialize: function(){
    this.model.on( "reset", this.render, this );
  },

  render: function(){
    _.each( this.model.fields, function( field ){
      this.$el.find( ".fields" ).append( "<label>" + field + "</label><input name=\"" + field + "\" />" );
    }, this );

    // ... more render logic here

    return this;
  }
});

var myForm = new MyForm();
var myFormView = new MyFormView({ el: "#form", model: myForm });

此代码依赖于以下HTML:

<form id="form">
  <div class="fields"></div>
</form>

当然这是一个非常简化的示例,还有更多优雅的解决方案,例如在子视图中为任何字段系列委派但是我只想给你一个起点。