2012-02-29 3 views
1

Есть ли способ связать событие, которое должно произойти после завершения рендеринга в режиме позвоночника?Backbone.js: инициировать событие в представлении после визуализации

Я пытаюсь подключить jQuery Date Range Picker к вводу, который добавляется к DOM после щелчка ссылки, но если я это сделаю во время рендеринга, выбор диапазона появится не в том месте (потому что вход еще не получил позицию DOM). Поэтому мне нужно подождать до тех пор, пока вход не будет представлен, прежде чем я присоединяю сборщик дат. Coffeescript ниже.

@makeDateRangePicker является функцией, которая inits на дату Picker

class window.ClientDestinationPricingFieldsView extends ModelSaverView 
    template: (json) -> 
    _.template(jQuery("#special-pricing-timeframe-template").html()) json 

    render: -> 
    jQuery(@el).html @template(@model.toJSON()) 
    @makeDateRangePicker jQuery(@el).find("input[name=date_range]") 
    this 

ответ

2

Я хотел бы попробовать это:

class window.ClientDestinationPricingFieldsView extends ModelSaverView 
    events: 
    'click input[name=date_range]': 'makeDateRangePicker' 

    template: (json) -> 
    _.template(jQuery("#special-pricing-timeframe-template").html()) json 

    render: -> 
    jQuery(@el).html @template(@model.toJSON()) 
    this 

Вы должны изменить @makeDateRangePicker взять элемент события вместо этого.

1

Edit: Итак, мой последний удар в растворе не было.

Что вы говорите, что после вашего звонка на jQuery(@el).html ожидаемого html нет? Это звучит очень странно. Я думаю, что это может быть не так просто, как вам нужно процитировать ваше значение атрибута:

jQuery(@el).find("input[name='date_range']") 

' Обратите внимание на одинарной кавычки вокруг date_range.

Редактировать: Извините, после проверки, что на самом деле это работает без кавычек. Я уже был укушен чем-то подобным. В любом случае, если вопрос правильный, как сейчас (после того, как он был обновлен информацией о добавлении ввода в событие click), вы должны позвонить makeDateRangePicker сразу после добавления этого элемента, не так ли?

+0

К сожалению, в вопросе о том, что это представление загружается после события клика из другого элемента на странице, должно быть указано, поэтому ожидание document.ready не исправит его. –

+0

Я понял, что после того, как я уже ответил. Итак, вы говорите, что 'input [name =' ... Я думаю, что у меня это есть. Редактирование моего ответа. –

1

Вы можете использовать setTimeout с нулевым значением для такого рода вещей. setTimeout(..., 0) по существу ставит очередь на функцию, которая будет вызываться после того, как браузер снова получит контроль. Что-то вроде этого:

render: -> 
    jQuery(@el).html @template(@model.toJSON()) 
    setTimeout 
    => @makeDateRangePicker jQuery(@el).find("input[name=date_range]") 
    0 
    @ 

Я часто использую этот трюк с Google Maps, чтобы он был правильно расположен и правильно.

+0

круто, я никогда не знал, что вы можете это сделать – teggy

0

Один из способов сделать это - вызвать пользовательское событие из родительского представления после завершения рендеринга. $('body').trigger('my-rendering-is-done') (лучший способ - вызвать его на вид, который отображается из вызывающего кода). И у вас есть слушатель, который использует makeDateRangePicker.

Смежные вопросы