2017-02-13 79 views
0

我想實現一個Handlebars helper,它將接收一些數據,並基於該數據生成一個列表。列表在輔助方法中生成後,我想循環這個列表。在這個例子中將會清楚。幫助器方法來生成列表

這種情況是:我有一些數據,並且當我解析數據時,我想爲該數據中的不一致性創建一些自定義警告。負責從原始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列表中的元素。

我註冊的助手:

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; 
} 

所以我希望這3個警告的text特性,在一個列表,而是我得到一個錯誤:

遺漏的類型錯誤:逆在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 helper(理所當然,我並不完全熟悉你正試圖解決的問題)。