【问题标题】:Scoping issue - calling an internal dojo function from external function范围问题 - 从外部函数调用内部 dojo 函数
【发布时间】:2018-11-12 16:22:59
【问题描述】:

我有一个在 dojo 函数的 require 部分之外的函数。

此函数需要调用位于 dojo 要求块中的函数。

如何从位于 dojo require 块之外的函数调用 require 代码块中的函数?

也许更多的应用程序流程会证明需要

  • 主窗口应用程序产生一个子窗口
  • 主窗口向具有将接收消息的全局函数的子窗口发送消息
  • 子窗口收到消息
  • 外部函数解析消息并确定映射 需要更新(生成的子窗口是映射窗口,在 require 部分加载了很多 ESRI 模块)
  • 子窗口函数需要调用一个函数 在 dojo 的 require 代码块中执行实际的 ESRI 相关任务

【问题讨论】:

  • 发布部分代码会很好,另外,您使用的是 Iframe 还是 pupup 窗口?

标签: javascript dojo esri-javascript-api


【解决方案1】:

这是一个 hacky 解决方案,如果可能的话,您应该真正想办法重新排列模块,但这至少应该可行:

var inside = null;

function outside () {
  try { inside(); }
  catch (err) { /* log error or throw away, whatever */ }
}

require(['dojo/_base/declare', ..., 'your/module/function'], function (declare, ..., myModuleFunction) {
  inside = myModuleFunction;
  outside();
});

只需 require 包含函数的模块(在示例中名为 "your/module/function"myModuleFunction),将其存储在 require 的变量 outside 中并在函数中调用它已经在外部定义了。我添加了一个 try-catch 块,因为它是一个很好的措施,可以防止您的代码在您过早调用 outside 时崩溃。

如果 inside dojo require 块中的函数不是模块,则几乎相同:

var inside = null;

function outside () {
  try { inside(); }
  catch (err) { /* log error or throw away, whatever */ }
}

require(['dojo/_base/declare'], function (declare) {
  inside = function () { console.log('Inside the require block'); };
  outside();
});

除非你不必require它。

【讨论】:

  • 嗨,David - 感谢您的回复...您描述的 myModuleFunction - 您能详细说明这个函数吗?
  • myModuleFunction 只是一个代表 在你的 require 块中的函数的名称。我能想到为什么如果不导入/需要它就无法访问它的唯一原因是因为它本身就是一个模块(或模块的一部分)。你的问题没有提到任何名字,所以我不得不想出一些东西;-)
【解决方案2】:

谈论一个黑客......这是我为获得所需结果所做的工作。

我在表单上创建了一个隐藏按钮,绑定了点击事件来触发该功能。

当消息被接收和处理后,我触发了按钮点击事件——中提琴!!

感谢大家的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-14
    • 2018-06-12
    • 2017-01-04
    • 2012-06-20
    • 2014-10-01
    • 2016-06-23
    • 1970-01-01
    • 2019-10-05
    相关资源
    最近更新 更多