gpt4 book ai didi

javascript - RequireJS:如何将变量从一个文件传递到另一个文件?

转载 作者:搜寻专家 更新时间:2023-11-01 05:23:07 24 4
gpt4 key购买 nike

我使用 require with backbone + backbone-forms。我目前正在使用 RequireJS 将代码分成多个文件。我将模型存储在单独的文件中,并希望单独保存表单验证器。

但是,我无法访问一个文件中定义的变量,而另一个文件依赖于这个文件。我得到的是 Uncaught ReferenceError: isEmptyName is not definedisEmptyName 在验证器中定义并在模型中使用。也欢迎任何有关 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']
}
});

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;
};

model.js 的开始需要 validators.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...
}, ...

最佳答案

我认为当您真正需要的是define 时,您正在使用require。来自 When should I use require() and when to use define()? ,

With define you register a module in require.js that you than can depend on in other module definitions or require statements. With require you "just" load/use a module or javascript file that can be loaded by require.js.


所以在这里,您有一些在一个文件中定义的变量,但需要在另一个文件中访问。看起来像一个“模块”,不是吗?所以现在,您可以通过两种方式将此文件用作模块:

  1. 符合 AMD 风格
  2. 符合困惑的 javascript 全局可变性

使用 AMD 方法

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
}
};

您会注意到 require 已被替换为 define。现在,当某人(模型)依赖于 validator.js 时,他们可以按如下方式访问其依赖项

require(['backbone','backboneForms','mask','validators'], 
function(backbone, backboneForms, mask, validators) {

var isEmptyNameReference = validators.someFunction;
...

使用垫片

检查 Requirejs why and when to use shim config , 其中引用 this link它说,

if we were to just add the backbone.js file to our project and list Backbone as a dependency from one of our modules, it wouldn’t work. RequireJS will load backbone.js, but nothing in backbone.js registers itself as a module with RequireJS. RequireJS will throw up its hands and say something like, “Well, I loaded the file, but I didn’t find any module in there.”

因此,您可以让您的 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
}
}();

你的 config.js 将是,

shim: {
'validator': {
deps: ['backbone','backboneForms'],
exports: 'Globals.Validator'
},
...

请注意,您可以根据需要为命名空间设置别名,但别名只是对现有全局对象/命名空间的引用。如果您将 Foo.Bar.Foobar 作为命名空间,但想将其称为 FB,这将很有帮助。因此,Shimming 是非 AMD 库适应 AMD 使用的一种方式。 在这种情况下,选项 1 应该足够了。

关于javascript - RequireJS:如何将变量从一个文件传递到另一个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23649078/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com