我正试图在流星中试验这个库 - https://code.google.com/p/autotags/。我正在努力弄清楚为什么事情确实发生了,哪些事情不起作用。
首先,当我尝试将所有单个javascript文件安装到客户端/兼容性文件夹时,从常量js文件调用AUTOTAGS时收到错误消息:
AUTOTAGS = { ... } // autotags-js-core.js
AUTOTAGS.TAG_CONSTANTS = [ 'news','research','favourite' ]; // autotags-js-constants.js
它一直说AUTOTAGS未定义。我从阅读全局范围中推断出任何具有VAR的外部库都要具有全局范围,并将其置于兼容性之下。
如果这是正确的,那么当将所有单个文件放在lib / external下时,为什么范围不是全局的? AUTOTAGS = {..}没有var意味着它可用于整个应用程序吗?
相反,我通过在lib / external下的一个单独的js文件中组合所有javascript文件来使范围工作。我以为我理解了,但情况变得更糟。
在单个js文件中 - 以闭包开头的任何函数都是该FILE的本地函数,而不是全局作用域,而赋给变量名的任何函数都使它成为全局变量?
function(something() { ... } ) // closure, local
generateTags = function() { ... } // global scope?
var generateTags = function() { .... } // is this local or global?
如果var generateTags函数是本地的,那么将它置于客户端/兼容性下将使其成为全局?最后! - 我得到了一个模糊的概念,我应该在这里定义全局变量lib / environment.js - https://github.com/oortcloud/unofficial-meteor-faq#where-should-i-put-my-files,这是真的吗?
如此困惑...... PS。 Javascript的新手,阅读它。提前谢谢!
答案 0 :(得分:0)
这里实际上有两个问题。一个是关于范围如何在 javascript 中工作,另一个是关于将自动标记库集成到流星项目中。由于第一个答案应该比较容易在其他地方找到,我只会尝试回答第二个问题。
你得到这个"未定义的原因"错误不是范围问题,但它与文件加载到流星应用程序的顺序有某种关系。也就是说,autotags-js-constants.js
在autotag-js-core.js
之前,因为常量在字母顺序中位于核心之前。因此,AUTOTAGS
变量未在解析autotags-js-constants.js
文件时定义。
解决此问题的一种简单方法是重命名文件,以强制执行正确的加载顺序。另一种方法是使用一种工具,使您能够定义文件之间的依赖关系。如果您有兴趣,请查看require项目,该项目基本上是核心 requirejs 功能的轻量级和流星友好型实现。
但是,最好的解决方案可能是创建自定义智能包。它允许您明确定义应加载文件的顺序。只需看看一些现有的智能包,就可以了解如何实现它。我还建议使用meteorite来管理您的自定义智能包。