【问题标题】:Where to place javascript functions in Meteor applications在 Meteor 应用程序中放置 javascript 函数的位置
【发布时间】:2013-10-07 12:01:04
【问题描述】:

在 Meteor 中,我们通常将 javascript 函数附加到模板。我们在哪里放置标准的 javascript 函数?

例如,在我的一个应用程序中,我有一个 UserInfo.js 文件,其中包含一系列用于处理用户登录和获取用户信息的 javascript 函数。

以下是我在 UserInfo.js

中的两个函数

文件位于 client/scripts 文件夹中:

isAdminById = function(userId) {
  var user;
  user = Meteor.users.findOne(userId);
  return user && isAdmin(user);
};

isAdmin = function(user) {
  if (!user || typeof user === 'undefined') {
    return false;
  } else {
    return !!user.isAdmin;
  }
};

当我运行应用程序并从浏览器控制台调用 isAdmin() 时,它会显示:

ReferenceError: isAdmin is not defined

---- 编辑----

当我将 javascript 文件放在 client/compatibility 文件夹下时,问题似乎已暂时解决,但现在问题又出现了。我记得唯一改变的是打电话给>> Meteor Reset

更多信息:

我认为当我使用咖啡脚本时会出现问题。当我将咖啡脚本文件转换为 js 文件时,一切似乎都正常。

【问题讨论】:

  • 您编写的所有内容在 v0.6.5.1 中都可以正常工作。你运行的是什么流星版本?
  • 您可能在浏览器加载之前调用了您的函数。确保对isAdmin 的每次调用都在启动后执行的函数内。
  • 我正在运行版本 v0.6.5.1。在应用程序加载并运行后,我尝试从 Firebug 控制台调用 isAdmin。
  • 嗨@FreeLancer,如果你把repro上传到github,其他人调试起来会容易很多。

标签: javascript node.js meteor


【解决方案1】:

您需要使用@ 将coffeescript 变量声明为全局变量:

@isAdmin = user -> ...

这是由于 Meteor 变量阴影如何与 coffeescript 自动变量声明一起工作。

默认情况下,Coffeescript 自己执行“智能”变量声明 - 基本上是将 var variableName 放在变量可见的 javascript 中的第一位。在您的情况下,这会导致 isAdmin 在 js 中由 var 声明,因此它的范围是文件。

使用@ char 通过将变量绑定到thisglobalwindow 对象来取代此默认行为。

【讨论】:

  • 是的,解决了它。谢谢
【解决方案2】:

您的代码是正确的,可能是load order 问题。

【讨论】:

  • 我的 javascript 文件只是许多方法的列表,我将它放在 client/scripts 文件夹中,应该正确加载它吗?
  • 好的,所以在深入挖掘您提到的链接之后,似乎将 javascript 文件放在 client/compatibility 文件夹中解决了它:Some JavaScript libraries only work when placed in the client/compatibility subdirectory. Files in this directory are executed without being wrapped in a new variable scope. This means that each top-level var defines a global variable. In addition, these files are executed before other client-side JavaScript files.
猜你喜欢
  • 1970-01-01
  • 2012-04-18
  • 2012-05-19
  • 2012-09-06
  • 2016-05-13
  • 1970-01-01
  • 1970-01-01
  • 2015-10-28
  • 1970-01-01
相关资源
最近更新 更多