添加到集合时指定额外属性

时间:2014-04-30 12:33:32

标签: javascript json backbone.js marionette

我们有一个骨干/木偶应用程序在工作和一位同事,我想知道最好的方法是做什么。这是我们希望做的简化示例。

您有一个要在前端显示的人员列表,您显示的字段是:

  • employeeReference
  • 的firstName
  • lastName的

然而,用于创建人的相同页面上的表单也需要

  • DATEOFBIRTH

(我已经大大简化了这个例子 - 我们代码中的dateOfBirth实际上是几个select元素,我们宁愿不必忽略返回模型的部分。)

处理此问题的最佳方法是什么?理想情况下,我们希望在此示例中通过REST(POST)传递4个属性,但返回的模型应该只有3个属性。

我已经使用Google搜索,但大多数示例都非常简单,并处理相同的属性被发送和传出。在此先感谢:)

3 个答案:

答案 0 :(得分:1)

您正在谈论的A.)您拥有的数据(对象模型)和B.)视图模型。

排除地图是您不需要的额外逻辑,您可以创建另一个模型并继承默认值并扩展它们,或者可能只创建另一个包含您需要的相同和额外成员的视图模型。

所以缺少的实际上是另一个模型,它是数据的表示(视图模型),包括/不包括出生日期/其他数据。

然后,您可以使用视图中的数据更改常规模型并保存:

reulgarModel.set(_.omit(viewModel.toJSON(),"dateOfBirth"));

答案 1 :(得分:0)

您可以覆盖模型的解析功能:

var myModel = Backbone.Model.extend({
   parse: function(response, options){
      delete response.dateOfBirth;
      return response;
   }
});

请注意,这会改变响应对象,您可能最好将其克隆到新对象中,或者只是迭代属性并在某处构建排除映射 - 您可以使用选项。

答案 2 :(得分:0)

只是继续从@Alexanders回答,但您可以在集合的解析函数中创建模型的新实例,并仅返回集合所需的JSON位。这是一个例子:

parse: function(response) {

  if(response.data.dateOfBirth){
    //Create a new model to hold the date of birth selects
    var dobSelect = new DateOfBirthSelects();

    dobSelect.set("days", response.data.dateOfBirth.days);
    dobSelect.set("months", response.data.dateOfBirth.months);
    dobSelect.set("years", response.data.dateOfBirth.years);

  };



  // Return the employee data to create the collection
  return response.data.employees;

引用的JSON如下所示:

...
data:{
"employees":[
{
"employeeReference": 123
"firstName": "John"
"lastName": "Smith"
},
{
"employeeReference": 124
"firstName": "Jean"
"lastName": "Smith"
}
],
"dateOfBirth":{
"days":["01","02","03"...],
"months":["01","02","03"...],
"years":["1991","1992","1993"...],
}

}
...