8

使用RequireJS时有没有办法设置templateSettingsfor lodash

现在在我的主要创业公司中,

  require(['lodash', 'question/view'], function(_, QuestionView) {
    var questionView;
    _.templateSettings = {
      interpolate: /\{\{(.+?)\}\}/g,
      evaluate: /\{\%(.+?)\%\}/g
    };
    questionView = new QuestionView();
    return questionView.render();
  });

但它似乎不想设置templateSettings全局,因为当我_.template(...)在模块中使用时,它想使用默认值templateSettings。问题是我不想在每个使用_.template(...).

4

3 回答 3

16

根据@Tyson Phalp 的建议,这意味着这个 SO question
我根据您的问题对其进行了调整,并使用 RequireJS 2.1.2 和SHIM configuration对其进行了测试。
这是main.js文件,这就是 requireJS 配置所在的位置:

require.config({
/*  The shim config allows us to configure dependencies for
    scripts that do not call define() to register a module */

    shim: {
      underscoreBase: {
        exports: '_'
      },
      underscore: {
        deps: ['underscoreBase'],
        exports: '_'
      }

    },
    paths: {
      underscoreBase: '../lib/underscore-min',
      underscore: '../lib/underscoreTplSettings',
    }
});

require(['app'],function(app){
  app.start();
});

然后您应该underscoreTplSettings.js使用您的 templateSettings 创建文件,如下所示:

define(['underscoreBase'], function(_) {
    _.templateSettings = {
        evaluate:    /\{\{(.+?)\}\}/g,
        interpolate: /\{\{=(.+?)\}\}/g,
        escape: /\{\{-(.+?)\}\}/g
    };
    return _;
});

因此,您的模块underscore将包含下划线库和您的模板设置。
从您的应用程序模块中只需要该underscore模块,以这种方式:

define(['underscore','otherModule1', 'otherModule2'], 
   function( _, module1, module2,) { 
      //Your code in here
   }
);

我唯一的疑问是我_两次导出相同的符号,即使这项工作很艰难,我也不确定这是否被认为是一种好的做法。

==========================

替代解决方案: 这也可以正常工作,我想它更干净一点,避免创建和需要额外的模块作为上述解决方案。我已经使用初始化函数更改了 Shim 配置中的“导出”。如需进一步了解,请参阅Shim 配置参考

//shim config in main.js file
shim: {     
  underscore: {
      exports: '_',
      init: function () {
        this._.templateSettings = {
          evaluate:/\{\{(.+?)\}\}/g,
          interpolate:/\{\{=(.+?)\}\}/g,
          escape:/\{\{-(.+?)\}\}/g
        };
        return _; //this is what will be actually exported! 
      }
  }
}
于 2013-01-28T02:36:23.350 回答
0

您应该将带有模板设置的_变量作为函数参数或全局对象中的属性(浏览器的窗口nodejs的进程)传递。

_.templateSettings = {
      interpolate: /\{\{(.+?)\}\}/g,
      evaluate: /\{\%(.+?)\%\}/g
};
questionView = new QuestionView(_);

或者

_.templateSettings = {
      interpolate: /\{\{(.+?)\}\}/g,
      evaluate: /\{\%(.+?)\%\}/g
};
window._ = _  

第一种选择更好。

于 2012-10-25T18:06:23.533 回答
0

请记住,如果您使用下划线 >=1.6.0 或 lodash-amd,则解决方案非常简单:

“main.js”配置文件

require.config({
  baseUrl: './', // Your base URL
  paths: {
    // Path to a module you create that will require the underscore module.
    // You cannot use the "underscore" name since underscore.js registers "underscore" as its module name.
    // That's why I use "_".
    _: 'underscore',

   // Path to underscore module 
   underscore: '../../bower_components/underscore/underscore',
  }
});

您的“_.js”文件:

define(['underscore'], function(_) {

  // Here you can manipulate/customize underscore.js to your taste.
  // For example: I usually add the "variable" setting for templates
  // here so that it's applied to all templates automatically.

  // Add "variable" property so templates are able to render faster!
  // @see http://underscorejs.org/#template
  _.templateSettings.variable = 'data';

  return _;
});

一个模块文件。它需要我们的“_”模块,该模块需要“下划线”并对其进行修补。

define(['_'], function(_){
  // You can see the "variable" property is there
  console.log(_.templateSettings);   
});
于 2014-09-04T16:54:25.203 回答