Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/458.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 限制使用在RequireJS范围之外定义的脚本_Javascript_Requirejs_Prototypejs_Ractivejs - Fatal编程技术网

Javascript 限制使用在RequireJS范围之外定义的脚本

Javascript 限制使用在RequireJS范围之外定义的脚本,javascript,requirejs,prototypejs,ractivejs,Javascript,Requirejs,Prototypejs,Ractivejs,我无法解决作用域(全局变量/名称空间)的问题。问题是,我在一个项目中有一些遗留代码,其中我使用Require.js添加了新功能。此旧代码是使用标准的标记加载的,但新代码是使用Require加载的。当我在Require中添加Ractive.js作为AMD时,问题就出现了。因为遗留代码加载Prototype.js,所以它与Ractive.js有一些冲突 主要问题是在观察阵列的变化时。具体来说,当我用pattern observer观察阵列时 ractive.observe('dataArray.*'

我无法解决作用域(全局变量/名称空间)的问题。问题是,我在一个项目中有一些遗留代码,其中我使用Require.js添加了新功能。此旧代码是使用标准的
标记加载的,但新代码是使用Require加载的。当我在Require中添加Ractive.js作为AMD时,问题就出现了。因为遗留代码加载Prototype.js,所以它与Ractive.js有一些冲突

主要问题是在观察阵列的变化时。具体来说,当我用pattern observer观察阵列时

ractive.observe('dataArray.*',函数(newValue、oldValue、keypath){
警报(“状态从“+oldValue+”更改为“+newValue”);
},{debug:true,init:false})

如果我不向数组中添加observer,一切正常,但如果我添加它,我会在prototype.js中得到一个错误
undefined is not a function
(当我从globals中删除prototype.js时不会发生这种情况)

另一个问题是,当我不使用模式观察者时,它实际上是有效的

所以,我的问题是,有没有办法将Require.js配置为只使用作为AMD-s加载的脚本? 或者,换句话说,将AMD脚本的范围仅限于彼此,以便忽略全局脚本


提前感谢。

我通过在页面中添加Prototype.js的旧版本,创建了一个类似的错误。我怀疑这是因为Prototype.js向
Array.Prototype
(除其他外)添加了非标准方法。这通常被认为是一件坏事,因为它使得在大型代码库中发生此类冲突的可能性相当大

具体地说,错误在于当处理模式观察者时,Ractive调用字符串上的
Array.prototype.map
map
函数在ES5中是标准的,但在较旧的浏览器(如IE8)中没有,因此Prototype添加了一个polyfill,但在Prototype的较旧版本中,它是一个不完整的polyfill。当您用字符串而不是错误调用它时(因为它使用自己的
this.each()
方法),这个损坏的polyfill会抛出一个错误——这在ES5中是一个不寻常但完全可以接受的操作

幸运的是,原型的最新版本似乎没有以同样的方式被破坏。我能够用1.6.1(他们文档网站上的版本,2009年起)重现错误,但不能用最新的1.7.2版本

因此,您有两种可能的选择:

  • 将Prototype升级至最新版本
  • 加载Prototype后,重写断开的
    map()
    方法。您可以使用(确保省略
    if(!Array.prototype.map){…}
    检查)

其中,第二个可能最不可能破坏依赖于原型的代码

你能提供更多关于这些冲突的信息吗?您是否遇到错误?不幸的是,没有办法从全局名称空间“屏蔽”AMD模块。@我已经更新了这个问题。谢谢你的阅读。:)非常感谢,你救了我:)