2015-09-22 30 views
4

我有一個非常簡單的車把幫助文件中helpers/handlebars.js如何使車把幫手全球(在expressjs)

var hbs = require('express-handlebars'); 

hbs.registerHelper("inc", function(value, options) { 
    return parseInt(value) + 1; 
}); 

然而,正如所料,我不能指{{#inc}}助手,因爲我沒有通過它進入res.render()函數。有沒有辦法讓我的文件全局助手和「自動包含」?

編輯:

試圖@ 1cgonza的真棒的答案後,我得到:

hbs.registerHelper("inc", function(value, options) { 
    ^
TypeError: undefined is not a function 

當運行應用程序。這裏是app.js

var engine  = require('express-handlebars'); 
        require('./helpers/handlebars.js')(engine); 

app.engine('hbs',   engine({defaultLayout: 'layout', extname: 'hbs'})); 
app.set('view engine',  'hbs'); 

任何想法?

回答

10

你可以嘗試導出你的助手作爲一個模塊,然後將它們包含在你的主app.js

事情是這樣的:

在你helpers/handlebars.js

function hbsHelpers(hbs) { 
    hbs.registerHelper("inc", function(value, options) { 
    return parseInt(value) + 1; 
    }); 

    // More helpers... 
} 

module.exports = hbsHelpers; 

然後在您的應用程序。 js(或您用作索引的文件)。

var hbs = require('express-handlebars'); 
require('./helpers/handlebars')(hbs); 

這是否適合您?

編輯

基礎上express-handlebarsdocs,我會在你的helpers/handlebars.js改變函數是這樣的:

function hbsHelpers(hbs) { 
    return hbs.create({ 
    helpers: { // This was missing 
     inc: function(value, options) { 
     console.log('reading it'); 
     return parseInt(value) + 1; 
     } 

     // More helpers... 
    } 

    }); 
} 

module.exports = hbsHelpers; 

讓我們知道,如果它的工作原理。

編輯2:

我的壞,一包裏面helpers:{}你的助手是從handelbars.js文件create()功能缺失。我編輯了我以前的回答,看看我在哪裏發表了評論,以瞭解我在說什麼。

至於app.js我認爲這是一個有點混淆了,所以讓我重新命名的幾件事情要分清楚:

// I've changed this from engine to exphbs, 
// so there is no confusion with the express engine object that we use later. 
var exphbs = require('express-handlebars'); 

// Create an instance of the express-handlebars 
// If you want to pass any option offered by express-handlebar module 
// do it inside the create() in the handlebars.js file 
var handlebars = require('./helpers/handlebars.js')(exphbs); 

// The handlebars variable now has an object called engine. 
// Use that to define your app.engine 
// As said before, you don't need to define any options here. 
// Everything is defined in the create() in handlebars.js 
app.engine('hbs', handlebars.engine); 

// If you are using a different extension, you can change hbs to whatever you are using. 
app.set('view engine', 'hbs'); 
+0

這肯定會奏效。但是,我收到上述錯誤 - 它看起來很熟悉嗎?謝謝! – n0pe

+1

啊,表達式句柄有另一種創建助手的方法,與我習慣的有點不同,請參閱他們的[docs](https://github.com/ericf/express-handlebars#helpers) – 1cgonza

+0

我已經編輯我的答案與另一個應該與你正在使用的把手模塊一起工作。 – 1cgonza

4

你可以試試:

在助手/ handlebars.js

var register = function(Handlebars) { 
    var helpers = { 
    inc: function(value, options) { 
     return parseInt(value) + 1; 
    }, 
    foo: function(var1, var2) { 
     return .... 
    } 
}; 

if (Handlebars && typeof Handlebars.registerHelper === "function") { 
    for (var prop in helpers) { 
     Handlebars.registerHelper(prop, helpers[prop]); 
    } 
} else { 
    return helpers; 
} 

}; 

module.exports.register = register; 
module.exports.helpers = register(null); 
在app.js

var exphbs = require('express-handlebars'); 
var hbsHelpers = exphbs.create({ 
    helpers: require("./helpers/handlebars.js").helpers, 
    defaultLayout: 'layout', 
    extname: '.hbs' 
}); 

app.engine('.hbs', hbsHelpers.engine); 
app.set('view engine', '.hbs'); 
+0

榮譽這個有用的答案。這幫助我縮小了將把手對象與佈局傳遞迴引擎的差距。謝謝。 –