0

Я использую этот CoffeeScript код:Параметров для визуализации методы в Backbone View

в файле спецификация:

index = new MeetingIndex(render: false, collection: booking.meetings) 
index.render(writeTo: '.sandbox') 

в файле вид:

render: (options = {}) -> 
    console.log 'options' 
    console.log options 
    console.log 'options' 
    options[key] ||= val for key, val of writeTo: 'body', enhanceUI: true 

Браузер консоль печатает :

Object 
    enhanceUI: true 
    writeTo: "body" 

Какой coul d быть здесь ?, как я могу передать параметры для метода render?

+1

Будьте в курсе того, что 'опции [ключ] || = val'. Если вы передадите 'enhUI: false', он будет переопределен как' true'. Если вы этого не хотите, вы можете изменить его на 'options [key]? = Val' :) – epidemian

ответ

1

Вы просто дурачат асинхронным console.log. Ваш первый вызов console.log просто захватывает ссылку на options, но к тому моменту, когда он попытается зарегистрировать его, вы уже обновили его. Попробуйте вместо этого:

render: (options = {}) -> 
    console.log 'options' 
    console.log _(options).clone() 
    console.log 'options' 
    options[key] ||= val for key, val of writeTo: 'body', enhanceUI: true 

Демо: http://jsfiddle.net/ambiguous/EZc7N/

+0

Я не уверен, что это то, что происходит. Разве он не должен получать 'enhUI: true, writeTo: .sandbox'' в консоли из-за его асинхронного поведения? – epidemian

+0

@epidemian: Это хороший момент. Это пахнет проблемой асинхронности, возможно, код не соответствует тому, что действительно делается. Какие-нибудь идеи о том, что еще может быть? –

+0

Нет, но поскольку ваш ответ был принят, вероятно, это была проблема 'console.log' :) (может быть, было больше кода, чем то, что мы видим здесь, и объект' options' был изменен позже?). – epidemian

0

Я не могу воспроизвести эту проблему. Это works as expected:

render = (options = {}) -> 
    console.log 'first:', JSON.stringify options 
    options[key] ||= val for key, val of writeTo: 'body', enhanceUI: true 
    console.log 'then:', JSON.stringify options 

render writeTo: '.sandbox' 

Выход:

first: {"writeTo":".sandbox"} 
then: {"writeTo":".sandbox","enhanceUI":true} 

Обратите внимание, что я хочу войти в JSON stringification объекта, чтобы избежать регистрации один и тот же объект дважды (как объект такой же, консоль отладки будет напечатать те же значения (текущее состояние)).

Кроме того, вы maight быть заинтересованы в Underscore's default заполнить аргументы по умолчанию:

render = (options = {}) -> 
    _.defaults options, writeTo: 'body', enhanceUI: true