1

У меня есть метод, который проходит вверх аргумент в гнездовом представлении в Backbone, как например:аргументов Попутных поверх тех, прошли триггер() в Backbone.js

page.get('condition') ? this.trigger('someEvent', object) : this.trigger('someOtherEvent', object); 

Как я понимаю, это код передаст объект «someEvent» или «someOtherEvent» в качестве первого аргумента для обратного вызова, указанного в прослушивателе для этого события.

Мой слушатель (в родительском файле вида) выглядит следующим образом:

this.parentView.on('someEvent', this.someFunction('extraArgument'), this); 

По умолчанию, если второй параметр был просто this.someFunction, я полагаю, что первый аргумент этой функции будет object. Моя проблема в том, что я хочу передать 'extraArgument' в дополнение к неявному переданному объекту.

Таким образом, я структурировать подпись this.someFunction так:

someFunction: function(object, extraArg) { 
    ... 
} 

Однако, отладочные операторы внутри функции показывают, что object в действительности extraArgument я проходил вручную, и что extraArg не определено в рамках функции. Как передать extraArgument без перезаписи аргумента, переданного из дочернего представления?

ответ

2

Когда вы говорите, это:

this.parentView.on('someEvent', this.someFunction('extraArgument'), this); 

вы звоните this.someFunction прямо там, когда список аргументов для this.parentView.on строится. Тогда все, что возвращается this.someFunction('extraArgument'), связано как обратный вызов для события 'someEvent'. Ваш someFunction, вероятно, не возвращает функцию, поэтому этот вызов on не принесет ничего полезного.

Похоже, что вы хотите частично оценить this.someFunction, чтобы создать новую функцию, аналогичную this.someFunction, но первым аргументом всегда является 'extraArgument'. Подчеркивание предложения _.partial именно для этой цели:

частичной_.partial(function, *arguments)

частично применить функцию путем заполнения любого числа своих аргументов, не изменяя его динамический this значения.

Таким образом, вы бы сказали:

this.parentView.on(
    'someEvent', 
    _(this.someFunction).partial('extraArgument'), 
    this 
); 

Вы также можете использовать _.bind для этого, если вы хотите установить this по пути.

+0

Не должно быть '_.partial (this.someFunction, 'extraArgument')'? – Jack

+0

@Jack: '_.f (x)' и '_ (x) .f()' эквивалентны, я склонен использовать '_ (x) .f()', потому что он лучше меня читает. –

+0

Спасибо за то, что я этого не знал. Описывает ли это это где-то в документации underscore.js? – Jack

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