Backbone - привязка к событию сброса коллекции теряет ссылку на `this` - PullRequest
0 голосов
/ 29 декабря 2011

Я не думаю, что это необычная проблема, но я не смог найти ни одного решения, которое нашел работу. Вот мой [упрощенный] вид:

class MyView extends Backbone.View
    el: '#mydiv'

    initialize: ->
        @collection.bind 'reset', @render, @

    render: ->
        $(@el).html('my content')

Когда срабатывает reset, render 's this был перекрыт, а @el равно undefined. Насколько я понимаю, 3-й параметр bind должен был позаботиться об этом, но, похоже, этого не происходит. Я использую Backbone 0.5.3.

Я также пытался использовать «жирную стрелку» на рендере, но это тоже не сработало:

    render: =>
        $(@el).html('my content')

Обновление

Как указал Тревор Бернхем ниже, это не было проблемой с ограничением объема, это было то, что мое свойство el не было доступно при загрузке страницы (оно было создано позже). Я все еще ищу лучший способ справиться с этим (используя свойство id в представлении).

Ответы [ 2 ]

2 голосов
/ 29 декабря 2011

Я не думаю, что проблема в том, что render вызывается в неправильном контексте, а в том, что свойство el представления никогда не является элементом DOM.Существует ли что-то с идентификатором mydiv в то время, когда вы звоните new MyView?Если нет, то это проблема.

Внутренне, когда el является строкой, Backbone делает вызов

this.el = $(this.el).get(0);

из конструктора представления.Если ничего не соответствует этой строке селектора, @el будет undefined, что вы и видите.

0 голосов
/ 29 декабря 2011

Используйте двойную стрелку => вместо одиночной стрелки -> при определении метода render, и CoffeeScript гарантирует, что указатель this указывает на экземпляр класса. Кроме того, вы можете попытаться установить для члена id ссылку id вместо члена el, поскольку документация для магистрали (http://documentcloud.github.com/backbone/#View-el) указывает, что el создается (самой магистралью) на основе любых id, tagName и className установлены на.

...