Как отправить коллекцию в другое представление?

#javascript #backbone.js

#javascript #backbone.js

Вопрос:

Есть ли способ отправить базовую коллекцию в другое представление без методов listenTo, отправить ее как массив или что-то еще.

Я выполняю выборку в функции инициализации, а затем помещаю коллекцию в свой массив, это плохо?

 this.userModels = [];

this.collectionUser = new app.types.Users();
this.collectionUser.fetch();

this.userModels.push(this.collectionUser);
  

Я пытаюсь отправить ее как массив, но при обновлении моей веб-страницы иногда я получаю это

 this.options child {
  length: 15,
  models: Array[15],
  _byId: Object,
  _listenId: "l4",
  _events: Object…
}
  

и когда-нибудь получать нулевые значения

 this.options child {
  length: 0,
  models: Array[0],
  _byId: Object,
  _listenId: "l4",
  _events: Object…
}
  

Итак, я хочу отправить свою коллекцию без метода listenTo, если это возможно.

Первый просмотр:

 app.types.FirstView = Backbone.View.extend({

  initialize: function() {
    this.collectionUser = new app.types.Users();
    this.collectionUser.fetch();
  };

  sendCollection: function() {
    var secondView = new app.types.SecondView({
      collection: this.collectionUser
    });
  }
});
  

Второе представление:

 app.types.SecondView = Backbone.View.extend({

  initialize: function(options) {
    this.collection = options.collection;

    // so i want to get this.collectionUser here without listenTo 
    // method and without fetch here is that possible ? I said
    // sometimes i get it sometimes not when i refersh my web page 
    // when i render it first time.
  };

});
  

Ответ №1:

Да, вы можете отправить все с помощью js и использовать initialize для этого представления. По вашему мнению, вам нужно объявить функцию инициализации следующим образом.

 var someView = Backbone.View.extend({
    template: _.template('some html file'),
    initialize: function(options){
        this.collection = options.collection
    },
    events: {
        'click .someclass': 'doSomthing',
        'click #someId': 'doSomthingElse'
    },
    doSomthing: function(event){
         event.preventDefault();
         var that = this;
         that.collection.fetch({
            success: function(){
                that.$('element').append(that.collection);
            }
        });
    },
    render: function(){
        var that = this;
        that.$el.html(that.template);
        return this;
    }
});
  

И когда вы создаете новый экземпляр своего представления, вам нужно передать свою коллекцию в качестве аргумента.

 this.collectionUser = new app.types.Users();
this.view = new someView({collection: this.collectionUser});
  

Это оно

Комментарии:

1. Я сделал это, но снова получаю в этом представлении длину null child {length: 0, models: Array[0], _byId: Object} .

2. В этом случае вам просто нужно передать аргумент collection us и в вашем представлении вызвать colection. выборка()

3. Сейчас я изменю ответ

4. Когда я ссылаюсь на свою веб-страницу, иногда я получаю длину 15, и это длина моей коллекции, а иногда я получаю ноль при обновлении, я не знаю, почему я это получаю.

5. вы получаете это, потому что, когда ваше представление отображает, ваша коллекция не обрабатывается.