【问题标题】:calling a client side function调用客户端函数
【发布时间】:2016-06-27 08:26:42
【问题描述】:

这个 Meteor 代码需要调用 main.js 中定义的 header.js 中的函数cleanSerializedArray();,这两个文件都在客户端目录下。

浏览器控制台错误:

Uncaught ReferenceError: cleanSerializedArray 未定义

但是当定义移动到同一个文件“header.js”时,控制台会说

未定义

为什么这 2 个出乎意料的结果,我希望看到函数在两种情况下都能正常工作?谢谢

'use strict';
Template.header.events({
  'click .mainMenu': function () {
    //control the footer visibility
    if (Session.get('showMainMenu')) {
      Session.set('showMainMenu', false);
    } else {
      console.log(cleanSerializedArray()); //<------- called
      //Meteor.call('storeUserInputs', objArray);
      Session.set('showMainMenu', true);
    }
});

function cleanSerializedArray() {
   return $('form').serializeArray().forEach(function (item) {
    item.value = item.value.replace(/[^0-9a-zA-Z]/g, '');
  });
}

【问题讨论】:

  • 函数是全局定义的吗? Javascript 看起来不错,所以我认为它与范围相关。

标签: javascript meteor


【解决方案1】:

你得到undefined,因为Array.prototype.forEach总是返回undefined
您可能希望将您的 cleanSerializedArray 函数更改为:

function cleanSerializedArray() {
    var array = $('form').serializeArray();
    array.forEach(function (item) {
        item.value = item.value.replace(/[^0-9a-zA-Z]/g, '');
    });
    return array;
}

至于您的ReferenceError,这通常是由以下两种情况之一引起的:

范围:

window.addEventListener('DOMContentLoaded', function()
{
    function myFunc(){ /* ... */ }

    /* some code that uses myFunc */
});
/* myFunc is not available out here */

时间:

window.addEventListener('DOMContentLoaded', function()
{
    window.myFunc = function(){ /* ... */ }

    /* some code that uses myFunc */
});
/* myFunc is not available yet */

由于您似乎只是从事件处理程序中调用该函数,因此范围问题比时间问题更有可能。
尝试将函数声明为:

window.cleanSerializedArray = function() {
    // ...
};

【讨论】:

  • 重构函数并修复范围解决了问题。关于范围,Meteor 不照顾它吗?
  • @FredJ。我完全没有使用 Meteor 的经验,但只要你还在运行 JavaScript,你就会受到 JavaScript 的规则和属性的约束。在我看来,Meteor 还不是它自己的语言。
猜你喜欢
  • 1970-01-01
  • 2018-10-20
  • 2016-06-20
  • 1970-01-01
  • 2017-06-27
  • 2015-01-10
  • 2011-10-04
  • 2020-10-18
  • 1970-01-01
相关资源
最近更新 更多