изменение магистральной коллекции не запускается при смене модели

#backbone.js

#backbone.js

Вопрос:

Я создаю интерфейс с backbone поверх API и задаюсь вопросом, почему change событие не запускается. Выборка и сохранение работают, но шаблон не повторяется.

Коллекция

 var Clients = Backbone.Collection.extend({
  url: API.host   '/clients',
  model: Client
});
 

Модель

 var Client = Backbone.Model.extend({
  urlRoot: API.host   '/clients',
  defaults: {
    clients: {
      number: '',
      company: '',
      address1: '',
      address2: '',
      city: '',
      zip: '',
      country: '',
      tax: '',
      email: '',
      phone: ''
    }
  }
});
 

Вид

 var ClientsView = Backbone.View.extend({

  id: 'content',

  initialize: function() {

    // instantiate Collection
    this.model = new Clients();

    // compile Handlebars template
    this.tpl = Handlebars.compile(this.template);

    // bind change and reset model events to rerender template
    this.model.bind('change', this.render);
    this.model.bind('reset', this.render);
  },

  render: function() {

    var self = this;
    var obj = this.el;

    // get clients and set data to handlebars template
    $.when(this.model.fetch()).then(function(response) {
      $(obj).html(self.tpl(response));
    }, function() {
      $(obj).html(self.tpl);
    });

    return this;
  },

  events: {
    "click #client-save": "save"
  },

  save: function(e) {

    // cache target and parent object for quick form access
    var obj = e.target;
    var parent = $(obj).closest('#client-modal');

    var client = new Client({
      clients: {
        number: parent.find('[name="number"]').val(),
        company: parent.find('[name="company"]').val(),
        address1: parent.find('[name="address1"]').val(),
        address2: parent.find('[name="address2"]').val(),
        city: parent.find('[name="city"]').val(),
        zip: parent.find('[name="zip"]').val(),
        country: parent.find('[name="country"]').val(),
        tax: parent.find('[name="tax"]').val(),
        email: parent.find('[name="email"]').val(),
        phone: parent.find('[name="phone"]').val(),
        web: parent.find('[name="web"]').val()
      }
    });

    client.save();

    return false;

  }

});
 

Ответ №1:

Вам нужно передать контекст, когда вы связываете свои функции.

this.model.bind(‘change’, this.render, this)

Попробуйте использовать другое имя для экземпляра вашей коллекции.

 // Example
this.collectionClients = new Clients();
 

/

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

1. this.model.bind('change', this.render, this) получилось! 🙂 Но почему я должен использовать другое имя для своего экземпляра коллекции?

2. Когда вы создаете переменную с именем model внутри своего представления, backbone for convention предполагает, что у вас есть модель, прикрепленная к вашему представлению, и это не ваш cenario.

3. this.collection было бы обычным именем для свойства коллекции, на ваш взгляд, которое даже имеет ту же специальную обработку, что this.model и. listenTo обычно это лучший способ связать события , чем bind .