2016-08-21 2 views
0

Я пытаюсь использовать подвыражение в Handlebars, но ошибка «options.fn не является функцией» даже в простейшем выражении. При использовании дополнительных помощников из https://github.com/assemble/handlebars-helpers, это выражение отлично работает:Подвыражение рулевых панелей «options.fn is not a function» error

{{#and true true}}OK{{/and}} 

Но если я подвыражения как этот

{{#and (gt 4 3) (gt 5 4)}}OK{{/and}} 

Или это

{{#and (gt 4 3) true}}OK{{/and}} 

Библиотека выдает ошибку

TypeError: [feed.hbs] options.fn is not a function
   at Object.helpers.gt (/Users/me/Projects/jackal/node_modules/handlebars-helpers/lib/comparison.js:152:20)
   at Object.eval (eval at createFunctionContext ...

Мне нужно проверить два условия. В это время он достигнут с помощью вложенных выражений:

{{#gt 4 3}} 
    {{#gt 5 4}} 
     ok 
    {{/gt}} 
{{/gt}} 

Так что же случилось с моими подвыражениями?

+0

в документации на [ 'рули-helpers'] (https://github.com/assemble/handlebars-helpers), я не могу видеть, что они упоминают подвыражения в любом месте. Где вы видели, что вы можете использовать подвыражения? –

+0

http://handlebarsjs.com/expressions.html здесь – tonghae

+0

Я создал проблему, ссылающуюся на ваш вопрос. –

ответ

0

Для меня это выглядит так: подвыражения не поддерживаются handlebars-helpers таким образом.

Я коротко посмотрел на код с отладчиком. Для {{#and (gt 4 3) (gt 5 4)}}OK{{/and}} и (gt 4 3) сам называется правильно, но кода gt помощника является:

helpers.gt = function(a, b, options) { 
    if (arguments.length === 2) { 
    options = b; 
    b = options.hash.compare; 
    } 
    if (a > b) { 
    return options.fn(this); 
    } 
    return options.inverse(this); 
}; 

Но поскольку подвыражения не делают ни у fn (если блок), ни inverse (другой блок), то handlebars-helpers не удается в этот момент.

Чтобы поддержать ваше выражение в handlebars-helpers потребность - ИМХО - переписать свой код, чтобы что-то вроде этого:

helpers.gt = function(a, b, options) { 
    if (arguments.length === 2) { 
    options = b; 
    b = options.hash.compare; 
    } 

    //fn block exists to it is not a subexpression 

    if(options.fn) { 
    if (a > b) { 
     return options.fn(this); 
    } 
    return options.inverse(this); 
    } else { 
    return a > b; 
    } 
}; 

Так теперь вы не можете использовать подвыражения с handlebars-helpers.

Я добавил выпуск на их странице GitHub: Supporting Handlebars subexpressions

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