Магистраль и изменение атрибутов модели

#javascript #backbone.js

#javascript #backbone.js

Вопрос:

Я разрабатываю приложение, частично основанное на Backbone.js пример приложения todo. Все работало отлично, пока я не попытался добавить функцию редактирования. То, что я обнаружил, — это какое-то странное поведение.

У меня есть какая-то форма, которая создает новый объект модели и добавляет его в коллекцию. Когда создается новая модель (привязанная к событию «добавить»), также создается новое представление и добавляется в dom. Точно так же, как в том приложении todo, и это работает.

Что ж, теперь я пытаюсь добавить функцию редактирования. Я создаю входные элементы в методе view object и пытаюсь «отправить» изменения. Я пытаюсь сделать это сначала, просто изменив атрибуты модели с помощью view.model.set -method. Это работает, но запускается какое-то странное событие. Это могло бы быть прекрасно, так как я хотел бы снова отображать вид при изменении модели.

Основная проблема: на мой взгляд (рабочий объект), существует метод рендеринга, содержащий эту строку отладки: ‘console.log(this)’. Когда объект представления создается формой в первый раз, эта строка выводит правильный объект. Когда я пытаюсь отредактировать модель и присвоить ей новое значение, debug выводит совершенно другой объект. Это не работает, и рендеринг завершается с ошибкой.

Я надеюсь, что этих примеров достаточно.

Основной вид:

 this.myCollection.bind('add', function(model){
    var myView= new myViewRow({
        model: model
    });         
    $("#container").find('tbody').append(myView.render().el);
}, this);
  

и на мой взгляд:

 render: function() {
    console.log(this);

    var data = this.getAsArray();
    $(this.el).html(content);
    return this;
}
  

Есть какие-нибудь советы, что я делаю не так? Какой метод набора событий запускает и почему мой метод рендеринга после этого находится в неправильном объекте?

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

1. Не могли бы вы опубликовать полные просмотры?

Ответ №1:

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

 _.bindAll(this, "render");
  

Смотрите Backbone.js Часто задаваемые вопросы для объяснения этого. В магистральных представлениях обычной практикой является проверка того, что this переменная указывает на объект View, определенный в текущей области видимости функции, как обычно хотелось бы, чтобы это делалось.

Ответ №2:

Когда вы привязываетесь для прослушивания события изменения, вы должны привязать функцию прослушивателя к текущему представлению http://documentcloud.github.com/backbone/#FAQ-this

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

1. Это хороший момент и, вероятно, имеет какое-то отношение к моей проблеме. В любом случае, на мой взгляд, у меня есть эта строка для инициализации метода: this.model.bind(‘change’, this.render, this)