Подтвердить что ты не робот

Есть ли способ привязать триггер Model.() К функции View.render(), не создавая более одного?

A View обычно ожидает объект с этими атрибутами до его рендеринга:

{ el: '#someelement', model: someModel }

A View также позволяет привязывать события модели к функциям в представлении:

initialize: function() {
    this.model.bind('change', this.renderFromModel, this);
},

render: function() {
    $(this.el).html(this.template(this.model.toJSON()));
    return this;
},

renderFromModel: function() {
    var t = _.template($('#some-template').html());
    $('item-' + this.cid).html(t(this.toJSON()));
    return this;
},

Проблема в том, что в первый раз, когда мы создаем представление для рендеринга, он ожидает объект с моделью в нем; и во второй раз мы визуализируем представление, когда оно вызывается из Модели, это не так. Из-за этого я создаю две функции render().

Есть ли лучший способ достижения рендеринга отдельных элементов, который также может реагировать на события model.change()?

4b9b3361

Ответ 1

Я думаю, вам нужно обеспечить, чтобы ваш метод render всегда привязывал представление, вызывая метод bindSll underscore.js.

SomeView = Backbone.View.extend({
  initialize: function(){
    _.bindAll(this, "render");
    this.model.bind('change', this.render);
  },

  render: function(){
    $(this.el).html(this.template(this.model.toJSON()));
    return this;
  }
});

Ответ 2

Лучшим решением является использование функции listenTo:

SomeView = Backbone.View.extend({
  initialize: function(){
    this.listenTo(this.model, 'change', this.render);
  },

  render: function(){
    this.$el.html(this.template(this.model.toJSON()));
    return this;
  }
});

Таким образом, объект представления знает о его привязках, и все они могут быть удалены с помощью функции stopListening и не нужно вызывать bind или bindAll явно. И последнее, но не менее важное: мой код чище.

Ответ 3

Использовать метод _.bind() для установки области

 this.model.bind('change', _.bind(this.render, this));

Ответ 4

В соответствии с базой 0.9.2 (и, возможно, ранее) функция on() или bind() (а также ее аналог off() или unbind()) принимает необязательный параметр context для использования для this при вызове.

Итак,

SomeView = Backbone.View.extend({
  initialize: function(){
    _.bindAll(this, "render");
    this.model.bind('change', this.render);
  },

  render: function(){
    this.$el.html(this.template(this.model.toJSON()));
    return this;
  }
});

может стать

SomeView = Backbone.View.extend({
  initialize: function(){
    this.model.bind('change', this.render, this);
  },

  render: function(){
    this.$el.html(this.template(this.model.toJSON()));
    return this;
  }
});

Смотрите документацию для on().

Ответ 5

создать экземпляр модели в представлении

var myapp.myView  = new View({
        model: new Model
    });

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

this.model.bind('change', this.render,this)