Backbone: рдореЙрдбрд▓ рдХреЗ рдЕрдВрджрд░ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдореЙрдбрд▓ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдХреНрдпрд╛ рд╣реИ?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 4 рдирд╡ре░ 2010  ┬╖  11рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: jashkenas/backbone

рдореЗрд░реА рдЯреАрдо, рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдбреЗрдЯрд╛ рд╕реНрдХреАрдорд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реА рд╣реИред рдореВрд▓ рд░реВрдк рд╕реЗ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдирд╛рдо рдФрд░ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ рдФрд░ рдЗрд╕рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реИред рдЖрдЗрдЯрдо рдореЗрдВ рд╕реНрд╡рдпрдВ рдЙрдирдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реЗ рдЖрдИрдбреА рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдмрдбрд╝реЗ рдореЙрдбрд▓ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдЖрдЗрдЯрдо рдХреЛ рдореБрдЦреНрдп рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕реЗ рдЬреЛрдбрд╝рд╛/рд╕рдВрдкрд╛рджрд┐рдд/рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореЙрдбрд▓ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
{
рдирд╛рдо: "рдЯреЗрд╕реНрдЯ",
рд╕рдВрд╕реНрдХрд░рдг 1,
рдЖрдЗрдЯрдо: [
{рдирд╛рдо: "рдЖрдЗрдЯрдо 1",
рд╕реНрдерд┐рддрд┐: 0},
{рдирд╛рдо: "рдЖрдЗрдЯрдо 2",
рдкрдж : 1}]
}

рдореЙрдбрд▓ рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рд▓реЗрдХрд┐рди рдЬрдм рднреА рд╕рдВрдЧреНрд░рд╣ рдЕрдкрдбреЗрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдореЙрдбрд▓ рдХреЛ рдЕрдкрдиреЗ рдпреВрдЖрд░рдПрд▓ рдХреЗ рд╕рд╛рде рд╕рд░реНрд╡рд░ рдкрд░ рд╡рд╛рдкрд╕ рдкреЛрд╕реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдмреИрдХрдмреЛрди рдореЗрдВ рдЗрд╕реЗ рдореЙрдбрд▓ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдХреНрдпрд╛ рд╣реИ? рдЕрдЧрд░ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ рдореБрдЭреЗ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдФрд░ рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

@eranation : рдирд╣реАрдВ, рдХрд╛рдлреА рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдореИрдВ items рдХреЛ рдЕрдкрдиреЗ рдПрдЯреНрд░рд┐рдмреНрдпреВрдЯ рд╣реИрд╢ рд╕реЗ рдмрд╛рд╣рд░ рд░рдЦрдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЙрдиреНрд╣реЗрдВ рд╕рд┐рдВрдХ рдореЗрдВ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдЖрдк items рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓реЗрдВ, рдФрд░ рдЗрд╕реЗ рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕ рдЬреЛрдбрд╝реЗрдВ (рдиреАрдЪреЗ рджреЗрдЦреЗрдВ)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдЙрд╕ рддрд░реНрдХ рдХреЛ рд░рдЦрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдЬреЛ @rsim рдиреЗ initialize рдореЗрдВ рдЕрдкрдиреА constructor рдкрджреНрдзрддрд┐ рдореЗрдВ рдбрд╛рд▓рд╛ рд╣реИ, рдФрд░ on рдмрдЬрд╛рдп bind (рдЬреЛ рдЕрд░реНрдз-рдкрджрд╛рд╡рдирдд рд╣реИ)ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрд╣рд╛рдВ рд╕рдВрднрд╡ рд╣реЛ, рдЧреБрдг рдХреЗрд╡рд▓ рдЙрдерд▓реЗ рд╣реИрд╢ (рдХреЛрдИ рдиреЗрд╕реНрдЯреЗрдб рд╕рдВрдЧреНрд░рд╣, рдореЙрдбрд▓ рдЗрддреНрдпрд╛рджрд┐) рдирд╣реАрдВ рд╣реЛрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред

var Document = Backbone.Model.extend({
  constructor: function() {
    this.items = new ItemSet(null, {document: this});
    this.items.on('change', this.save, this);
    Backbone.Model.apply(this, arguments);
  },
  parse: function(resp) {
    this.items.set(resp.items, {parse: true, remove: false});
    delete resp.items;
    return resp;
  },
  toJSON: function() {
    var attrs = _.clone(this.attributes);
    attrs.items = this.items.toJSON();
    return attrs;
  }
});
var ItemSet = Backbone.Collection.extend({
  model: Item,
  initialize: function(models, options) {
    this.document = options.document;
  }
});
var Item = Backbone.Model.extend({
  // access document with this.collection.document
});
var document1 = new Document({
  name: "Test",
  version: 1,
  items: [
    {name : "Item 1", position : 0},
    {name : "Item 2", position : 1}
  ]
});

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдиреЗрд╕реНрдЯреЗрдб рд╕реНрдХреАрдорд╛ рдХреЗ рд▓рд┐рдП рднреА рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред ( рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреЗрдЦреЗрдВ)

рд╕рднреА 11 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рджреЛ рдореБрдЦреНрдп рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ... рдкрд╣рд▓рд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдЗрдЯрдо рдХреЛ рд╡реИрдирд┐рд▓рд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдПред рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдмрджрд▓рдиреЗ рдкрд░ рдмреИрдХрдмреЛрди рдПрдХ рдЧрд╣рд░реА рд╕рдорд╛рдирддрд╛ рдЬрд╛рдБрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдХреЛрдИ рдЖрдВрддрд░рд┐рдХ рдЖрдЗрдЯрдо рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдЪрд▓ рдЬрд╛рдПрдЧрд╛ред

рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдпрд╣ рд╣реИ рдХрд┐ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕реЗ рдЖрдЗрдЯрдо рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛рдП рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкрд░ рдЕрдЯрдХреЗ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдЕрдВрджрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдореЙрдбрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд┐рдпрд╛ рдЬрд╛рдП (рд╣рдо рджрд╕реНрддрд╛рд╡реЗрдЬрд╝рдХреНрд▓рд╛рдЙрдб рдкрд░ рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рддреЗ рд╣реИрдВ)ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП (рдореЛрдЯреЗ рддреМрд░ рдкрд░ рдмреЛрд▓):

var Document = Backbone.Model.extend({
  initialize: function() {
    this.items = new ItemSet();
    this.items.bind('change', this.save);
  }
});

рдХреНрдпрд╛ рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдЖрдкрдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?

рдореИрдВ "рджрд╕реНрддрд╛рд╡реЗрдЬрд╝" рд╕рдВрдкрддреНрддрд┐ рдХреЛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╡рд╛рдкрд╕ рдЬреЛрдбрд╝рдиреЗ рдХреА рднреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ рдЬрд┐рд╕реЗ рдЖрдЗрдЯрдо рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдиреЗ рдкрд░ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

var Document = Backbone.Model.extend({
  initialize: function() {
    this.items = new ItemSet(this.get('items'), {document: this});
    this.items.bind('change', this.save);
  }
});
var ItemSet = Backbone.Collection.extend({
  initialize: function(models, options) {
    this.document = options.document;
  }
});
var Item = Backbone.Model.extend({
  // access document with this.collection.document
});
var document1 = new Document({
  name: "Test",
  version: 1,
  items: [
    {name : "Item 1", position : 0},
    {name : "Item 2", position : 1}
  ]
});

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЖрдЗрдЯрдо рдХреА рдкрд░рд┐рд╡рд░реНрддрди рдШрдЯрдирд╛ рдХреЛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд░рдирд╛ рдЧрд╛рдпрдм рдЯреБрдХрдбрд╝рд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдЗрдЯрдорд╕реЗрдЯ рдореЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рднреА рдмрд╣реБрдд рдорджрджрдЧрд╛рд░ рд▓рдЧрддрд╛ рд╣реИред рд╣рдо рдЖрдЬ рдЗрд╕реЗ рдЖрдЬрдорд╛рдПрдВрдЧреЗ рдФрд░ рдореИрдВ рдЖрдк рд▓реЛрдЧреЛрдВ рдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдирд┐рдХрд▓рддрд╛ рд╣реИред

рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ред рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдореБрджреНрджрд╛ рдореЛрдВрдЧреЛрдЗрдб рдХреЗ рд╕рд╛рде рд╣реИред рдорджрдж рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╢реБрдХреНрд░рд┐рдпрд╛ рджреЛрд╕реНрддреЛрдВред

рдореИрдВ рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдПрдХ рд╕рд╛рде рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ рдЬрд╛рдЙрдВрдЧрд╛? рдЬрдм рднреА рдХреЛрдИ рдЖрдЗрдЯрдо рдмрджрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдореИрдВ рд╣рд░ рдмрд╛рд░ рдЕрдиреБрд░реЛрдз рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЙрди рд╕рднреА рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдкрд░ рдПрдХ рд╣реА рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде рд╕рд╣реЗрдЬрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореИрдВ рд╕рдм рдХреБрдЫ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдЬрдм рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ 'рдЖрдЗрдЯрдо' рдПрдЯреАрдЖрд░ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ?

рдЬрдм рддрдХ рдЖрдкрдХреЗ рдЖрдЗрдЯрдо рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рд╕реЗрдЯ рд╣реИрдВ, рддрдм рдЬрдм рдЖрдк рдХреЛрдИ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝.рд╕реЗрд╡ () рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдЗрдЯрдо рд╕рд░реНрд╡рд░ рдкрд░ рднреА рднреЗрдЬреЗ рдЬрд╛рдПрдВрдЧреЗред

рд▓реЗрдХрд┐рди рдорд╛рди рд▓реЗрдВ рдХрд┐ рдпрджрд┐ рдореИрдВ рд░рдирдЯрд╛рдЗрдо рдкрд░ рд╕рдВрдЧреНрд░рд╣ document1.items рдореЗрдВ рдХреЛрдИ рдЖрдЗрдЯрдо рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ рддреЛ рдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ 1 рдХреА 'рдЖрдЗрдЯрдо' рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдЬреБрдбрд╝рддрд╛ рд╣реИред рддреЛ рдЕрдЧрд░ рдореИрдВ рдПрдХ document1.save() рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдирдпрд╛ рдореЙрдбрд▓ рд╕рд░реНрд╡рд░ рдкрд░ рдирд╣реАрдВ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред рдореИрдВ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛ рдХрд┐ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдореЙрдбрд▓ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рдХреИрд╕реЗ рдкреНрд░рдЪрд╛рд░рд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд╕рд╛рде рднреЗрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВред

рддреЛ, рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓ рд░рд╣реЗ рд╣реИрдВ: рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЖрдЗрдЯрдо рд╕рд░рдгреА рд╣реИред рдЖрд░рдВрднреАрдХрд░рдг рдкрд░, рдПрдХ рдЕрддрд┐рднрд╛рд░рд┐рдд рд╕реЗрдЯ рд╡рд┐рдзрд┐ рдореЗрдВ, рдореИрдВ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рд╕реЗ рдПрдХ рдирдпрд╛ рдЖрдЗрдЯрдо рд╕рдВрдЧреНрд░рд╣ рдмрдирд╛рддрд╛ рд╣реВрдВ рдФрд░ рдЙрд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реВрдВред

class Document extends Backbone.Model
  defaults:
    items: []

  set: (attrs, options) ->
    items = attrs['items']
    if _( items ).isArray()
      if _( items ).isEmpty()
        attrs['items'] = new DocumentItemsCollection
        newItem = new Item
        attrs['items'].add(newItem, { silent: true })
      else
        attrs['items'] = new DocumentItemsCollection items

рдЙрд╕ рд╕рдордп рдЖрдк рдХреЗрд╡рд▓ 'рдкреНрд░рд╛рдкреНрдд', 'рд╕реЗрдЯ', 'рдЬреЛрдбрд╝реЗрдВ' рдФрд░ 'рдирд┐рдХрд╛рд▓реЗрдВ' рдХреЗ рд╕рд╛рде рдЖрдЗрдЯрдо рд╕рдВрдЧреНрд░рд╣ рд╡рд┐рдзрд┐рдпреЛрдВ рд╕реЗ рдирд┐рдкрдЯрддреЗ рд╣реИрдВред рдЖрдк рдбреЙрдЯ рдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдЦрд┐рд▓рд╡рд╛рдбрд╝ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдореЗрд░реЗ рдкрд╛рд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкрд░ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЖрдЧ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП AddItem рдФрд░ deleteItem рдирд╛рдордХ рдореЗрд░реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╡рд░реНрдЧ рдкрд░ рднреА рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВред рдЬрдм рдЖрдк рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкрд░ рдПрдХ рд╕реЗрд╡ () рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдЖрдкрдХреЗ рдЖрдЗрдЯрдо рд╕рдВрдЧреНрд░рд╣ рдкрд░ JSON рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред

рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдпрд╣ рд╣рдорд╛рд░реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдорд╛рдорд▓рд╛ рд╣реИ рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдФрд░ рднреА рдЧрд╣рд░реЗ рдЙрдк-рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╣реИрдВред рд░реАрдврд╝ рдХреА рд╣рдбреНрдбреА рдХреЗ рд╕рд╛рде рдЬрдЯрд┐рд▓рддрд╛ рдХреА рдЗрд╕ рдорд╛рддреНрд░рд╛ рд╕реЗ рдирд┐рдкрдЯрдирд╛, рдФрд░ рдореЙрдбрд▓реЛрдВ рдкрд░ рдХрдИ рддрд░реАрдХреЛрдВ рдХреЛ рдУрд╡рд░рд▓реЛрдб рдХрд░рдирд╛, рдЧрдзреЗ рдореЗрдВ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдмрдбрд╝рд╛ рджрд░реНрдж рд╣реИред рдЕрдм рд╣рдо рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдмреИрдХрдмреЛрди рдХреЛ рд╕реНрдкреНрд░рд╛рдЙрдЯрдХреЛрд░ рд╕реЗ рдмрджрд▓рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдпрджрд┐ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрдЯрд┐рд▓ рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рд╣реИ рддреЛ рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛ рдХрд┐ рдЖрдк ExtJS рдпрд╛ рд╕реНрдкреНрд░рд╛рдЙрдЯрдХреЛрд░ рджреЗрдЦреЗрдВред рдмреИрдХрдмреЛрди рд╕рд╛рдзрд╛рд░рдг рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рдПрдХ рдЫреЛрдЯреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рд╡рд╕реНрддреБрдПрдВ/рдмрд╛рддрдЪреАрдд рддреЗрдЬ рд╣реЛрдиреЗ рд▓рдЧрддреА рд╣реИрдВ рддреЛ рдмрд╣реБрдд рдЬрд▓реНрджреА рдЯреВрдЯ рдЬрд╛рддреА рд╣реИрдВред

рдХреНрдпрд╛ 1.0 рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдирдпрд╛ "рд╕рд░реНрд╡реЛрддреНрддрдо рдЕрднреНрдпрд╛рд╕" рд╣реИ?

@eranation : рдирд╣реАрдВ, рдХрд╛рдлреА рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдореИрдВ items рдХреЛ рдЕрдкрдиреЗ рдПрдЯреНрд░рд┐рдмреНрдпреВрдЯ рд╣реИрд╢ рд╕реЗ рдмрд╛рд╣рд░ рд░рдЦрдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЙрдиреНрд╣реЗрдВ рд╕рд┐рдВрдХ рдореЗрдВ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдЖрдк items рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓реЗрдВ, рдФрд░ рдЗрд╕реЗ рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕ рдЬреЛрдбрд╝реЗрдВ (рдиреАрдЪреЗ рджреЗрдЦреЗрдВ)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдЙрд╕ рддрд░реНрдХ рдХреЛ рд░рдЦрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдЬреЛ @rsim рдиреЗ initialize рдореЗрдВ рдЕрдкрдиреА constructor рдкрджреНрдзрддрд┐ рдореЗрдВ рдбрд╛рд▓рд╛ рд╣реИ, рдФрд░ on рдмрдЬрд╛рдп bind (рдЬреЛ рдЕрд░реНрдз-рдкрджрд╛рд╡рдирдд рд╣реИ)ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрд╣рд╛рдВ рд╕рдВрднрд╡ рд╣реЛ, рдЧреБрдг рдХреЗрд╡рд▓ рдЙрдерд▓реЗ рд╣реИрд╢ (рдХреЛрдИ рдиреЗрд╕реНрдЯреЗрдб рд╕рдВрдЧреНрд░рд╣, рдореЙрдбрд▓ рдЗрддреНрдпрд╛рджрд┐) рдирд╣реАрдВ рд╣реЛрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред

var Document = Backbone.Model.extend({
  constructor: function() {
    this.items = new ItemSet(null, {document: this});
    this.items.on('change', this.save, this);
    Backbone.Model.apply(this, arguments);
  },
  parse: function(resp) {
    this.items.set(resp.items, {parse: true, remove: false});
    delete resp.items;
    return resp;
  },
  toJSON: function() {
    var attrs = _.clone(this.attributes);
    attrs.items = this.items.toJSON();
    return attrs;
  }
});
var ItemSet = Backbone.Collection.extend({
  model: Item,
  initialize: function(models, options) {
    this.document = options.document;
  }
});
var Item = Backbone.Model.extend({
  // access document with this.collection.document
});
var document1 = new Document({
  name: "Test",
  version: 1,
  items: [
    {name : "Item 1", position : 0},
    {name : "Item 2", position : 1}
  ]
});

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдиреЗрд╕реНрдЯреЗрдб рд╕реНрдХреАрдорд╛ рдХреЗ рд▓рд┐рдП рднреА рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред ( рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреЗрдЦреЗрдВ)

@ akre54 рдзрдиреНрдпрд╡рд╛рдж, рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдмрд╣реБрдд рд╕рд░рд╛рд╣рдирд╛ рдХреА

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

alundiak picture alundiak  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

gfranko picture gfranko  ┬╖  18рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jamiebuilds picture jamiebuilds  ┬╖  12рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

spawnedc picture spawnedc  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

sarkasm picture sarkasm  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ