问题 requireJS中的全局变量[重复]


可能重复:
如何在使用AMD时加载Backbone.js中的自举模型(require.js) 

这是一个关于我的问题的简单演示。

我需要访问 id_user 在 main.js 文件。我的问题是,在这种情况下如何避免全局变量?为此目的使用全局变量是不好的做法吗?

main.js

require({
    paths : {
        jQuery : 'http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min'
    }
});

require([ 'jQuery' ], function() {
       alert(id_user);
    });

的index.php

<script data-main="js/main" src="js/require.js"></script>

<script type="text/javascript">
function users() {
    id_user = <?php echo $id; ?>
}

users();
</script>

7475
2018-04-17 21:42


起源

我会说你没有绕过全球变种。但使用不止一个是不好的做法:-) - Bergi


答案:


在使用requirejs的项目中不应该存在任何全局变量,因为它处理模块并且所有模块(及其属性/方法)永远不会被全局声明以保持环境的美观和清洁。如果您需要一个模块在另一个模块中使用变量集,那么它们应该通过某个API相互通信,或者将该变量设置为属性,需要模块并以此方式获取属性。

但也许你应该问自己是否真的需要requirejs。如果你想构建一个适当的基于模块的应用程序(我不确定你是否想知道如何传递变量)那么是的,如果您只想从JS加载少量文件,那么LazyLoad(http:// www。 appelsiini.net/projects/lazyload)可能就是答案。只是说根据你的情况特别考虑requirejs的足迹,值得思考。


10
2018-04-17 22:05



传递变量的一种hacky方法是在DOM中将它们设置在<meta name =“MyData”value =“Boo”id =“myData”/>中,然后抓取value属性。 - GillesC
但在一个简单的情况下,需要将php变量传递给main.js.您在谈论什么类型的API? - daniel__
您应该声明一个包含该值的模块。因为requirejs刚刚加载,你应该能够定义('user',{id:<?php $ id?>});然后从main.js require('user',function(user){console.log(user.id)}); - GillesC
好。我理解这个想法。还有一个问题请。新模块用 define('user', { id: <?php $id ?> }); 应该是JS文件正确吗?因此,无法访问内部的php内容(id)。 - daniel__
我不深入了解requirejs,但是输入并查找它并不会花费很长时间。如果不是真正干净的方式来获取数据是通过ajax。或者只是使用全局对象来存储您需要的任何内容并进行查询。我们老实说我们都说不要使用全局变量但是rerquirejs做了什么,而且它甚至不使用单个对象而是使用多个全局函数:) - GillesC


您正在寻找的是将配置变量引导到项目中的能力。这回答了你的问题

如何在使用AMD时加载Backbone.js中的自举模型(require.js)


2
2018-04-25 18:30