Вложенные модели одного и того же «класса» в платформе Backbone.js? - PullRequest
1 голос
/ 27 марта 2012

Я новичок в Backbone.

Можно ли определить модель в магистрали, которая содержит список моделей того же типа? Пример:

MyModel = Backbone.Model.extend({
  initialize: function() {
    nestedMyModels:new Array();
  },

  addMyModel: function(aModel) {
    // Code here would push() aModel onto array
  },

  render: function() {
     // Loop through array calling render() recursively
  }
});

Я бы тогда имел View, который запускал рекурсивный вызов render (). Пример:

MyView = Backbone.View.extend({
  render:function() {
     this.model.render();
  }
});

Ответы [ 4 ]

3 голосов
/ 27 марта 2012

1 нет массивов, но коллекции

Всегда, что вы думаете в Array из Models в Backbone, думайте в Collection.

Теперь вам нужно внедрить коллекцию MyModels и сохранить один ее экземпляр в вашем MyModel экземпляре.

// code simplified and not tested
MyModel = Backbone.Model.extend({
  initialize: function() {
    this.nestedMyModels: new MyModels();
  },

  addMyModel: function( model ) {
    this.nestedMyModels.add( model );
  }
});

MyModels = Backbone.Collection.extend({
  model: MyModel
});

2 использовать виды для рендеринга

Всегда, что вы думаете в render, мыслите в View.

И рекомендуемый способ заключается в том, что если у вас есть Collection и Model, лучше иметь View для каждого. Таким образом, представление коллекции будет вызывать представление модели в итерации:

// code simplified and not tested
MyModelView = Backbone.View.extend({
  render: function(){
    this.$el.html( model.get("name") );
    var view = new MyModelsView({ collection: this.model.nestedMyModels });
    this.$el.append( view.render.el );

    return this;
  }  
});

MyModelsView = Backbone.View.extend({
  render: function(){
    this.collection.each( function( model ){
      var view = new MyModelView({ model: model });
      this.$el.append( view.render.el );
    });

    return this;
  }
});
0 голосов
/ 09 октября 2015

Можно ли определить модель в магистрали, которая содержит список моделей того же типа?

Конечно, почему бы и нет.

var MyModel = Nested.Model.extend();

MyModel.define({
  defaults : {
    nestedMyModels : MyModel.Collection
  },

  addMyModel: function( model ) {
      this.nestedMyModels.add( model );
  }
});

Простоне в ванильном остове.Вам понадобится плагин для этого.https://github.com/Volicon/backbone.nestedTypes

PS: И, как упоминалось в других ответах, вам нужно использовать View для рендеринга.Не модели.

0 голосов
/ 27 марта 2012

Коллекции - это заказанные наборы моделей.Для получения дополнительной информации проверьте.http://backbonejs.org/#Collection

Вот пример:

var Library = Backbone.Collection.extend({
  model: Book
});
0 голосов
/ 27 марта 2012

То, что вы хотите, это коллекция . В основном это список или массив моделей.

...