我目前正在尝试使用带有require.js的moment.js库,但我仍然无法理解这样一个项目的正确设置。以下是我在main.js文件中的操作:
requirejs.config({
baseUrl: 'app',
paths: {
// ... more parameters (all Backbone related)
'moment': 'lib/moment',
'moment_de': 'lib/lang/de',
},
shim: {
'moment' : {
deps: [],
},
'moment_de': {
deps: ['moment'],
},
// ... more parameters (all Backbone related)
}
});
我正在使用单独的模块进行配置。该模块如下所示:
define(['moment', 'moment_de'], function(moment, de) {
moment.lang('de');
var configuration = {}
// ...
return configuration;
});
如您所见,我正在尝试更改此文件中moment对象的全局语言,但我遇到以下错误消息:
Uncaught Error: Module name "../moment" has not been loaded yet for context: _. Use require([])
后来:
Uncaught TypeError: Cannot call method 'preparse' of undefined
第一条错误消息是正在加载的语言模块,尽管它应该在当前模块之后加载(如果我正确的话)。第二个是从尝试切换到尚未加载的语言模块的时刻模块。
有人可以就这个问题发表一些看法。提前谢谢。
编辑:我使用缩小语言版本修复了问题(例如this one)。显然,缩小版本使用AMD格式,这样可以更容易地包含在require.js项目中。
我仍然不太明白为什么不能使用shim配置包含语言。也许有人可以试着解释一下。
答案 0 :(得分:4)
此示例旨在演示如何将moment.js
翻译与navigator.language
属性一起使用,通常是用户的首选语言。
在requirejs配置中单独定义moment.js
和语言文件,如下所示:
require.config({
config: {
'moment': {
noGlobal: true
}
},
paths: {
...
'moment': '../vendor/moment/moment',
'moment_de': '../vendor/moment/locale/de',
'moment_pl': '../vendor/moment/locale/pl'
...
},
...
});
创建一个小模块,例如lib/moment.js
并指定您的语言配置(您可以找到RFC 4646语言标记列表here):
define(function(require) {
'use strict';
var moment = require('moment'), locale;
switch(navigator.language) {
case 'de':
case 'de-at':
case 'de-de':
case 'de-li':
case 'de-lu':
case 'de-ch':
locale = 'moment_de';
break;
case 'pl':
locale = 'moment_pl';
break;
...
}
if (locale) {
require([locale]);
}
return moment;
});
请注意:moment.js
默认支持英语。
在chaplinjs视图类(或任何其他mvc类/普通脚本等)中,使用它如下:
define([
'chaplin'
'lib/moment'
], function(Chaplin, moment) {
'use strict';
var MyView = Chaplin.View.extend({
...
parse: function() {
...
console.log(moment().format('LLL'));
...
}
...
});
return MyView;
});
答案 1 :(得分:3)
require({
paths: {
'moment': '//cdnjs.cloudflare.com/ajax/libs/moment.js/2.0.0/moment.min',
'moment_de': '//cdnjs.cloudflare.com/ajax/libs/moment.js/2.0.0/lang/de.min'
}
}, ['moment', 'moment_de'], function(moment){
moment.lang('de');
alert(moment(1316116057189).fromNow());
});
你应该不需要对模块进行填充,因为moment.js支持AMD。 http://jsfiddle.net/moderndegree/xYXUC/