code: function(attr, model) {
        var firstBracket = attr.indexOf('[]');
        if (firstBracket === -1) {
          return [attr];
        } else {
          var attrName = attr.substring(0, firstBracket);
          var remainder = attr.substring(firstBracket + 2);
          var subAttrs = [];
          var values = model.get(attrName);
          if (!values) {
            return [attr];
          }
          var indexes;
          if (_.isArray(values)) {
            indexes = _.range(values.length);
          } else {
            indexes = _.keys(values);
          }
          _.each(indexes, function(index) {
            var indexToken = '[' + index + ']';
            if (_.isString(index)) {
              indexToken = '.' + index;
            }
            subAttrs.push(this.__generateSubAttributes(attrName + indexToken + remainder, model));
          }, this);
          return subAttrs;
        }
      }
docs: Generates an array of all the possible field accessors and their indices when using
  the "open" array notation:
  foo[] -> ['foo[0]', 'foo[1]'].
  Will also perform nested arrays:
  foo[][] -> ['foo[0][0]', foo[1][0]']
  Supports both foo[x] and foo.bar
  @method __generateSubAttributes
  @private
  @param {String} attr The name of the attribute to expand according to the bound model
  @return {Array<String>} The fully expanded subattribute names