2017-08-29 35 views
0

具有以下組裝文件,並且按預期方式加載所有內容。該文件編譯如果我使用handlebar-helpers,但它缺少我需要的helpers。因此,我不得不使用自定義幫助文件/模塊導入自定義手柄助手以進行組裝的正確方法

var gulp = require('gulp'); 
var rename = require('gulp-rename'); 
var assemble = require('assemble'); 
//var helpers = require('handlebars-helpers'); 
var app = assemble(); 
var prettify = require('gulp-prettify'); 
var config = require('../config'); 

gulp.task('init', function(cb) { 
    app.helpers(config.paths.path_src + 'partials/_helpers/is-helper.js'); 
    //app.helper('compare', helpers.comparison()); 
    app.partials(config.paths.path_src + 'templates/includes/**/*.hbs'); 
    app.layouts(config.paths.path_src + 'templates/layouts/**/*.hbs'); 
    app.pages(config.paths.path_src + 'templates/content/**/*.hbs'); 
    cb(); 
}); 

gulp.task('assemble', ['init'], function() { 
    return app.toStream('pages') 
    .pipe(app.renderFile()) 
    .pipe(prettify({ 
     indent_inner_html: false, 
     preserve_newlines: true, 
     end_with_newline: true, 
     extra_liners: ['head', 'body'] 
    })) 
    .pipe(rename({ 
     extname: '.html' 
    })) 
    .pipe(rename({dirname: ''})) 
    .pipe(app.dest('site')); 
}); 

gulp.task('test', ['assemble']); 

現在,我已經嘗試過車把幫手,但它並沒有幫助文件我後讓我不得不使用下面的一個:

/* 
    Custom handlebars helpers which allows to make 

    {{#is a '===' b}}} 

    {{/is}} 
*/ 

module.exports.register = function (handlebars) { 

    var isArray = function(value) { 
     return Object.prototype.toString.call(value) === '[object Array]'; 
    } 

    var ExpressionRegistry = function() { 
     this.expressions = []; 
    }; 

    ExpressionRegistry.prototype.add = function (operator, method) { 
     this.expressions[operator] = method; 
    }; 

    ExpressionRegistry.prototype.call = function (operator, left, right) { 
     if (! this.expressions.hasOwnProperty(operator)) { 
      throw new Error('Unknown operator "'+operator+'"'); 
     } 

     return this.expressions[operator](left, right); 
    }; 

    var eR = new ExpressionRegistry; 
    eR.add('not', function(left, right) { 
     return left != right; 
    }); 
    eR.add('>', function(left, right) { 
     return left > right; 
    }); 
    eR.add('<', function(left, right) { 
     return left < right; 
    }); 
    eR.add('>=', function(left, right) { 
     return left >= right; 
    }); 
    eR.add('<=', function(left, right) { 
     return left <= right; 
    }); 

    eR.add('==', function(left, right) { 
     return left == right; 
    }); 

    eR.add('===', function(left, right) { 
     return left === right; 
    }); 
    eR.add('!==', function(left, right) { 
     return left !== right; 
    }); 
    eR.add('in', function(left, right) { 
     if (! isArray(right)) { 
      right = right.split(','); 
     } 
     return right.indexOf(left) !== -1; 
    }); 

    var isHelper = function() { 
     var args = arguments 
     , left = args[0] 
     , operator = args[1] 
     , right = args[2] 
     , options = args[3] 
     ; 


     // console.log(args); 

     if (args.length == 2) { 
      options = args[1]; 
      if (left) return options.fn(this); 
      return options.inverse(this); 
     } 

     if (args.length == 3) { 
      right = args[1]; 
      options = args[2]; 
      if (left == right) return options.fn(this); 
      return options.inverse(this); 
     } 

     if (eR.call(operator, left, right)) { 
      return options.fn(this); 
     } 
     return options.inverse(this); 
    }; 

    handlebars.registerHelper('is', isHelper); 

    return eR; 
}; 

我不斷收到以下錯誤,失蹤幫手「是」。看起來像它不註冊! 請幫忙!!!

回答

0

在參照this github issue

is的輔助文檔here

還有一種方法可以導入自定義助手嗎?

這被描述爲here。 而不是使用一個路徑,您使用require

// single helper (required module returns the helper function) 
app.helper('is', require('./helpers/is')); 

// multiple helpers (required module returns an object of helper functions... e.g. key/value pairs) 
app.helpers(require('./helpers')); 

上面的自定義助手代碼使用grunt-assemble語法註冊幫手。在這種情況下,我會改變你的幫手,看起來像這樣:

/* 
    Custom handlebars helpers which allows to make 

    {{#is a '===' b}}} 

    {{/is}} 
*/ 

module.exports = function() { 

    var isArray = function(value) { 
     return Object.prototype.toString.call(value) === '[object Array]'; 
    } 

    var ExpressionRegistry = function() { 
     this.expressions = []; 
    }; 

    ExpressionRegistry.prototype.add = function (operator, method) { 
     this.expressions[operator] = method; 
    }; 

    ExpressionRegistry.prototype.call = function (operator, left, right) { 
     if (! this.expressions.hasOwnProperty(operator)) { 
      throw new Error('Unknown operator "'+operator+'"'); 
     } 

     return this.expressions[operator](left, right); 
    }; 

    var eR = new ExpressionRegistry; 
    eR.add('not', function(left, right) { 
     return left != right; 
    }); 
    eR.add('>', function(left, right) { 
     return left > right; 
    }); 
    eR.add('<', function(left, right) { 
     return left < right; 
    }); 
    eR.add('>=', function(left, right) { 
     return left >= right; 
    }); 
    eR.add('<=', function(left, right) { 
     return left <= right; 
    }); 

    eR.add('==', function(left, right) { 
     return left == right; 
    }); 

    eR.add('===', function(left, right) { 
     return left === right; 
    }); 
    eR.add('!==', function(left, right) { 
     return left !== right; 
    }); 
    eR.add('in', function(left, right) { 
     if (! isArray(right)) { 
      right = right.split(','); 
     } 
     return right.indexOf(left) !== -1; 
    }); 

    var isHelper = function() { 
     var args = arguments 
     , left = args[0] 
     , operator = args[1] 
     , right = args[2] 
     , options = args[3] 
     ; 


     // console.log(args); 

     if (args.length == 2) { 
      options = args[1]; 
      if (left) return options.fn(this); 
      return options.inverse(this); 
     } 

     if (args.length == 3) { 
      right = args[1]; 
      options = args[2]; 
      if (left == right) return options.fn(this); 
      return options.inverse(this); 
     } 

     if (eR.call(operator, left, right)) { 
      return options.fn(this); 
     } 
     return options.inverse(this); 
    }; 

    return isHelper; 
}; 

的在組合可以通過執行加載幫手:

var isHelper = require(config.paths.path_src + 'partials/_helpers/is-helper')); 
app.helper('is', isHelper()); 

注意,從is-helper返回的函數被調用之前傳遞給app.helper。這使您可以將自定義選項傳遞給助手(例如,您在助手中使用的自定義表達式),但這取決於您。

希望這會有所幫助。

+0

我試圖導入你給我的新格式,它顯示了以下錯誤 找不到模塊「的.src /諧音/ _helpers /是輔助性」 我100%肯定的模塊是存在的,但它看起來像它沒有註冊。它很奇怪.. – webkitfanz

+0

任何意見? ... – webkitfanz

+0

這是一個節點「需要」錯誤。如果路徑實際上是'.src/partials/_helpers/is-helper',那麼您需要在它之前添加一個'。/',這樣節點就知道它是相對的而不是來自'node_modules':'./。src/partials/_helpers/is-helper' – doowb

相關問題