使用某个表达式获取嵌套的主干模型属性

时间:2014-04-16 10:03:36

标签: javascript backbone.js

我正在使用下面显示的Backbone模型

var myModel = Backbone.Model.extend({
    defaults:{
      name: 'user',
      address: {
        city: '',
        state: '',
        area: {
         code: '',
         street: ''
         //More properties
        }
      }
  });

因此,我可以使用

访问嵌套的街道属性
 model.get('address').area.street

现在我有一个像

这样的字符串
 properties = 'area.street'

如何使用它来访问嵌套的街道属性?

我们可以直接访问嵌套属性吗?

2 个答案:

答案 0 :(得分:0)

您可以使用Underscore的flatten方法展平嵌套,这会将对象放在一个项目数组中并将street放在该对象的顶层:

var flatAddress = _.flatten(model.get('address'))

如果您正在'area.street'工作,那将无济于事。给定一个表示点表示法的字符串,字符串可能需要以JS对象可以消化的方式分解。考虑像

这样的东西
var array = properties.split('.');
var fromAddress = model.get('address');
for (var i = 0; i < array.length; i++ ) {
  fromAddress = fromAddress[array[i]];
}

或者如果Array.reduce可用/可取:

var property = properties.split('.').reduce(function(prev,curr) {
  return prev[curr];
}, model.get('address'));  

要么在模型上作为属性来推动重用,也值得。

答案 1 :(得分:0)

看看this question - 答案显示了如何在backbone.model上使用构造函数,然后执行此操作:

constructor(input: IListItem) {
    super();
    for (var key in input) {
        if (key) {
            //this.set(key, input[key]);
            this[key] = input[key];
        }
    }
}

使用this [key] = input [key]方法创建Backbone模型将允许您编写如下代码:

model.get('address').get('area').get('street')

如果您使用ES5语法(如答案中所述) - 您甚至可以编写如下代码:

model.Address.Area.Street

此外,您可能会发现this blog帖子有用。