2015-07-07 4 views
1

Я использую summernote API (http://summernote.org/#/deep-dive), и используя функцию обратного вызова для OnKeyUp следующим образом:Передача события обратного вызова функции

$('#summernote').summernote({ 
    height: 150, 
    onkeyup: myFunction 
}); 

для HTML:

<textarea id="summernote"></textarea> 

Я определил MYFUNCTION, как. ..

var myFunction= function(e) { 
    var num_chars = $(e.target).text().length 
    console.log(num_chars); 
} 

Теперь я хотел бы передать некоторые параметры с помощью .bind() в myFunction. Когда я

onkeyup: myFuntion.bind(1,2) 

$ (это) или e.target не работает, это, вероятно, связано с тем, как PARAMS перемешиваются вокруг, когда используют .bind()

Как сохранить е .target и передать дополнительные данные функции со связыванием?

Любая помощь будет оценена по достоинству.

+0

Я думаю, вы могли бы найти эту документацию EventHandler полезно. [API docs] (http://summernote.org/jsduck/#!/api/EventHandler) Кажется, что вы можете получить доступ ко всем видам объектов событий с помощью '$ .summernote.eventHandler.methodOfYourChoice();' – camelCase

ответ

1

Таким образом, вы не можете использовать bind. Вы пытаетесь частично применить аргументы с правой стороны функции (потому что вы хотите, чтобы первый аргумент был событием). Кроме того, bind(1, 2) устанавливает this в 1 и передает 2 вызываемой функции. Это выглядит как вы хотите что-то вроде этого:

onkeyup: _.partialRight(myFunction, 1, 2); 

function myFunction(event, data1, data2) { 
    var numChars = $(e.target).text().length; 
    console.log(numChars); 
} 

Однако, вы можете потерять связывание this. Если вы хотите сохранить, что вы должны использовать bind снова, но как это:

onkeyup: _.partialRight(myFunction.bind($), 1, 2); // This will bind this to $ 

function myFunction(event, data1, data2) { 
    var numChars = this(e.target).text().length; // because this is $ 
} 

_ в этом примере lodash.

Причина, по которой вы это делаете (и что вы не можете использовать для этого привязку), заключается в том, что привязка частично применяется от слева. Это означает, что он передаст ему свои аргументы сначала, а затем любые аргументы, переданные связанной функции при ее вызове, будут переданы впоследствии. Другими словами, ваш оригинальный набор, вы получите это:

myFunction(2, event); // "this" is 1 

Вместо того, что вы хотите, что:

myFunction(event, 1, 2); // "this" is undefined behaviour 

Для этого вам просто нужно частично применить функцию выше, который даст вам желаемое поведение. Причина, по которой мы используем partialRight, состоит в том, что это приводит к тому, что сначала применяются все аргументы, которые были переданы вызываемой функции, а затем аргументы, переданные для связывания. Если вы не использовали partialRight и использовали вместо partial, вы бы вместо того, чтобы получить это:

myFunction(1, 2, event); // "this" is undefined behaviour 

Этот бит может быть немного за пределами вашей досягаемости

bind устанавливает ThisBinding от функции к this при условии ,Любые дополнительные аргументы частично применяются (слева) к функции, а затем возвращается возвращаемая функция. Это означает, что в следующий раз, когда вы вызовете результирующую функцию, она будет вызывать функцию с помощью ThisBinding, которую вы указали в bind, плюс аргументы, предоставленные вами в bind, плюс любые аргументы EXTRA, которые вы передали, как welll.

+1

Отказ от ответственности: Я никогда не использовал summernote раньше, поэтому может быть более простой способ сделать это; Я просто даю простой подход к JS –

+0

Стоит прочитать, хотя! Спасибо за объяснение. – camelCase

+0

Я боюсь, что не очень хорошо это объяснил, так как я не совсем точно понимаю, как * частное приложение работает самостоятельно, только то, что оно на самом деле делает. Так что простите мне любые умирающие FPers –

1

Дальнейшая оценка документы API, я думаю, что ответ может быть найден в рамках предоставленного метода eventHandler().

У вас есть доступ к bindKeyMap(layoutInfo, keyMap), где keyMap является объектом.

Возможно, что-то вроде: $.summernote.eventHandler.bindKeyMap(); даст то, что вам нужно?

Documents for bindKeyMap()

Documents for eventHandler()

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