Szy*_*mak 4 javascript requirejs
我正在使用带有骨干+骨干表单的require.我目前正在使用RequireJS将代码分成多个文件.我将模型存储在单独的文件中,并希望单独保留表单验证器.
但是,我无法访问在一个文件中定义的变量,在另一个依赖于此文件的文件中.我得到的是Uncaught ReferenceError: isEmptyName is not defined
.isEmptyName
在验证器中定义并在模型中使用.任何有关RequireJS配置的反馈也值得赞赏.
我的配置:
requirejs.config({
//By default load any module IDs from js/lib
baseUrl: 'js',
paths: {
jquery: 'lib/jquery',
app: 'lib/app',
wizard: 'lib/jquery.bootstrap.wizard.min',
bootstrap: 'lib/bootstrap.min',
underscore: 'lib/underscore-min',
backbone: 'lib/backbone-min',
backboneForms: 'lib/backbone-forms.min',
langSwitcher: 'lib/lang',
cookie: 'lib/cookie',
datepicker: 'lib/bootstrap-datepicker',
mask: 'lib/jquery.maskedinput.min',
validators: 'modules/validators',
// models
personalData: 'models/personal-data',
addressData: 'models/address-data',
workData: 'models/work-data',
productsData: 'models/products-data',
statmentData: 'models/statment-data',
model: 'models/form',
collection: 'collections/form',
view: 'views/form',
setup: 'setup',
send: 'send',
},
shim: {
'underscore': {
deps: ['jquery'],
exports: '_'
},
'backbone': {
deps: ['underscore', 'jquery'],
exports: 'backbone'
},
// all model needs to go within one collection
'bootstrap' : ['jquery'],
'wizard': ['jquery'],
'backboneForms': ['backbone'],
'validators': ['backbone','mask'],
'personalData' : ['backbone','backboneForms','validators'],
'addressData': ['backbone','backboneForms'],
'workData': ['backbone','backboneForms'],
'statmentData': ['backbone','backboneForms'],
//'collection': ['backbone','backboneForms','personalData'],
//'view': ['backbone','backboneForms','personalData']
}
});
Run Code Online (Sandbox Code Playgroud)
validators.js的开头
require(['backbone','backboneForms'], function(){
var lettersOnly = /^[A-Za-z?ó????????Ó???????]+$/;
var lettersOnlyDash = /^[A-Za-z?ó????????Ó???????\-]+$/;
var err = {};
var errCh = {};
var errFormat = {};
var isEmptyName = function(value){
err = { message: 'Wpisz imi?.'};
if (value.length === 0) return err;
};
Run Code Online (Sandbox Code Playgroud)
需要validators.js中的验证器的model.js的开头
require(['backbone','backboneForms','mask','validators'], function(backbone,backboneForms,mask,validators){
var PersonalData = Backbone.Model.extend({
schema: {
first_name:{
title: 'Imi?',
validators: [isEmptyName, isLetter, minCharCount] //Accessing validators.js members here...
}, ...
Run Code Online (Sandbox Code Playgroud)
我认为你正在使用的require
是你真正需要的东西define
.从何时起我应该使用require()以及何时使用define()?,
使用define,您可以在require.js中注册一个模块,您可以在其他模块定义或require语句中依赖该模块.有了require,你只需"加载"/使用require.js可以加载的模块或javascript文件.
所以在这里,您有一些在一个文件中定义的变量,但需要在另一个文件中访问.看起来像'模块',不是吗?现在,您有两种方法可以将此文件用作模块:
validators.js
现在是一个模块.任何希望使用"验证器功能"的人都可以依靠这个模块为它们提供它.那是,
define(['backbone','backboneForms'], function(){
var lettersOnly = /^[A-Za-z?ó????????Ó???????]+$/;
var isEmptyName = function(value){
err = { message: 'Wpisz imi?.'};
if (value.length === 0) return err;
return {
someVariable: lettersOnly,
someFunction: isEmptyName
}
};
Run Code Online (Sandbox Code Playgroud)
你会发现它require
已经被替换了define
.现在,当某人(模型)依赖于validator.js时,他们可以按如下方式访问其依赖项
require(['backbone','backboneForms','mask','validators'],
function(backbone, backboneForms, mask, validators) {
var isEmptyNameReference = validators.someFunction;
...
Run Code Online (Sandbox Code Playgroud)
shim
检查Requirejs为什么以及何时使用shim config,它引用了这个链接,
如果我们只是将backbone.js文件添加到我们的项目中并将Backbone列为我们其中一个模块的依赖项,那么它将无法工作.RequireJS将加载backbone.js,但backbone.js中没有任何内容将自己注册为具有RequireJS的模块.RequireJS会举起手来说出一句话,"嗯,我加载了文件,但我没有找到任何模块."
因此,您可以让您的validator.js填充全局Validator
命名空间,并且仍然按照我们在上面的示例中使用它的方式使用它.
function(){
var lettersOnly = /^[A-Za-z?ó????????Ó???????]+$/;
var isEmptyName = function(value){
err = { message: 'Wpisz imi?.'};
if (value.length === 0) return err;
Globals.Validator = {
someVariable: lettersOnly,
someFunction: isEmptyName
}
}();
Run Code Online (Sandbox Code Playgroud)
那你的config.js就是,
shim: {
'validator': {
deps: ['backbone','backboneForms'],
exports: 'Globals.Validator'
},
...
Run Code Online (Sandbox Code Playgroud)
请注意,您可以根据需要为命名空间添加别名,但别名只是对现有全局对象/命名空间的引用.如果你有,比如说Foo.Bar.Foobar
你的命名空间,但是想把它称为FB
.因此,Shimming是非AMD库适应AMD使用的一种方式.在这种情况下,选项1应该足够了.
归档时间: |
|
查看次数: |
2918 次 |
最近记录: |