RequireJS:如何将变量从一个文件传递到另一个文件?
Posted
技术标签:
【中文标题】RequireJS:如何将变量从一个文件传递到另一个文件?【英文标题】:RequireJS: How do I pass variables from one file to another? 【发布时间】:2014-07-02 04:18:26 【问题描述】:我将 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']
);
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;
;
开始需要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...
, ...
【问题讨论】:
您需要将验证器定义为返回 isEmptyName 的 AMD 模块才能使用它 虽然这个问题与另一个问题非常相似,但我认为对于 RequireJS 新手来说,将它作为一个“链接”到更具技术性的问题 here 会有所帮助 感谢您的帮助。它产生了一些影响,但我得到了一个不同的错误“未捕获的类型错误:无法读取未定义的属性'长度'”我将如何重写此函数以使其工作? 此错误发生在哪里 - 行、文件等。这意味着您尝试获取的var
的 length
是未定义的,这可能是由于多种原因.编辑:如果它在 value.length === 0
中,请检查 value
是否由调用者传入。
我可能说的很明显,但是 Chrome/Webkit 的 javascript 调试非常健壮。打开 Sources 选项卡并打开 validator.js,在该行放置一个断点。右侧窗格上的调用堆栈应该可以帮助您找出是谁在调用它...
【参考方案1】:
当你真正需要的是define
时,我认为你正在使用require
。来自When should I use require() and when to use define()?,
通过定义,您可以在 require.js 中注册一个模块,您可以 依赖于其他模块定义或要求语句。和 要求你“只是”加载/使用一个模块或 JavaScript 文件 由 require.js 加载。
所以在这里,您有一些变量在一个文件中定义,但需要在另一个文件中访问。看起来像一个“模块”,不是吗?所以现在,您有两种方法可以将此文件用作模块:
-
符合 AMD 特性
符合混乱的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;
...
使用shim
检查Requirejs why and when to use shim config,它引用了this link,它说,
如果我们只是将主干.js 文件添加到我们的项目并列出 Backbone 作为我们模块之一的依赖项,它不起作用。 RequireJS 将加载主干.js,但主干.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
();
你的 config.js 将是,
shim:
'validator':
deps: ['backbone','backboneForms'],
exports: 'Globals.Validator'
,
...
请注意,您可以根据需要为命名空间设置别名,但别名只是对现有全局对象/命名空间的引用。如果您有 Foo.Bar.Foobar
作为命名空间,但希望将其称为 FB
,这将很有帮助。因此,匀场是非 AMD 库适应 AMD 使用的一种方式。 在这种情况下,选项 1 就足够了。
【讨论】:
基本上是你可以从 *** 社区获得的最好的东西。非常感谢伙计。你是最好的。答案是描述性的,我学到了很多东西。非常非常感谢您的努力和时间。 嘿,我正在听从您的建议,但仍然无法做到。这是我的[问题]***.com/questions/29668293/…以上是关于RequireJS:如何将变量从一个文件传递到另一个文件?的主要内容,如果未能解决你的问题,请参考以下文章