2017-02-13 4 views
0

Я пытаюсь реализовать хелпер Handlebars, который будет принимать некоторые данные и на основе этих данных сгенерировать список. После того, как список был сгенерирован в вспомогательном методе, я хотел бы зациклировать этот список. Это будет ясно в этом примере.Вспомогательный метод для создания списка

Сценарий: У меня есть некоторые данные, и когда я анализирую данные, я хочу создать некоторые пользовательские предупреждения для несогласованности в этих данных. Метод, ответственный за генерирование предупреждений от необработанных данных JSON, называется generateWarnings().

У меня есть функции для компиляции шаблона и отображения данных, определяемый как это:

function compileTemplate(targetId) { 
    return Handlebars.compile($("#" + targetId).html()); 
} 

function renderData(template, context, targetId) { 
    $("#" + targetId).html(template(context)); 
} 

Я зову их:

var warningsPlaceHolderId = "warnings_plholder"; 
var warningsTemplateId = "warnings_template"; 

var warningsTemplate = HandlebarsHelpers.compileTemplate(warningsTemplateId); 
renderData(warningsTemplate, data, warningsPlaceHolderId); 

Рули шаблона:

<ol> 
    {{#each generateWarnings this}} 
     Warning description: {{this.text}} 
    {{/each}} 
</ol> 

Здесь generateWarnings Помощник должен взять мои сырые данные JSON, создать фактический список предупреждений, d отображает каждое из этих предупреждений как элемент в списке HTML .

Я зарегистрировал Helper:

Handlebars.registerHelper('generateWarnings', function(data) { 
     return generateWarnings(data); 
    }); 

generateAll: function(data) { 
    var warning1 = { 
     type: 'error', 
     text: 'Testing error!' 
    }; 

    var warning2 = { 
     type: 'warning', 
     text: 'Testing warning!' 
    }; 

    var warning3 = { 
     type: 'info', 
     text: 'Testing info' 
    }; 

    var arr = []; 
    arr.push(warning1); 
    arr.push(warning2); 
    arr.push(warning3); 

    return arr; 
} 

Так что я бы ожидать, что text свойство этих 3-х предупреждений, чтобы быть в списке, но вместо этого я получаю сообщение об ошибке:

Uncaught TypeError: обратный не является функцией в renderData().

ответ

0

Не следует ли использовать generateAll() в вашем помощнике?

Handlebars.registerHelper('generateWarnings', function(data) { 
     return generateWarnings(data); // THIS SHOULD BE generateAll(data)?? 
    }); 

generateAll: function(data) { 

Кроме того, вы используете этикетку ?! для вашей функции, которая не будет вызвана так, как вы ожидаете.

Это:

generateAll: function(data) { ... };

должно быть:

var generateAll = function(data) { ... };

Я никогда не видел, хорошее применение меток в JavaScript.

Ваш подход кажется немного необычным (и чрезмерно сложным). Почему бы просто не манипулировать данными, прежде чем передавать их в свой шаблон? Я хотел бы использовать JavaScript для генерации предупреждений, а затем присоединить их к вашим данным перед тем, как перейти к вашему шаблону. Я не вижу особой причины использовать помощник Handlebars в этой ситуации (предоставленный, я не совсем знаком с проблемой, которую вы пытаетесь решить).