【问题标题】:Carrying a variable from one Javascript file to another Javascript file in a Windows 8 App?在 Windows 8 应用程序中将变量从一个 Javascript 文件传送到另一个 Javascript 文件?
【发布时间】:2014-07-11 10:59:53
【问题描述】:

目前将硬编码的“/video/vid1.MP4”推送到列表中,并为所有项目显示此 URL。我想在“内容”下显示我在 Javascript2 中定义的变量。

HTML:

<video id=vid src='#' data-win-bind="src: videoUrl" />

JavaScript1:

        for (var i = 0; i <= this._items.length; i++) {
            list.push({ videoUrl: '/video/vid1.MP4' });
        }

这用于在不同的视图中生成数据! 我想将存储在内容中的变量调用到下面videoUrl下的javascript中。

JavaScript2:

var video = "/video/vid.mp4";    
     var sampleItems = [
                    { group: sampleGroups[0], content: video},
                    { group: sampleGroups[0],content: video},
                    { group: sampleGroups[0], content: video}
     ];

基本上我想使用“内容”而不是硬编码的网址。我想将信息从一个 JavaScript 文件传送到另一个文件。

例如。 list.push({ videoUrl: content });

【问题讨论】:

  • 真的很难理解你想要做什么,你能改写一下这个问题吗?例如,删除所有不相关的部分。

标签: javascript html windows-8 winjs


【解决方案1】:

您是否尝试将 sampleItems 数组中的每个项目推送到一个名为 list 的新数组中?

如果是这样:

for (var i = 0; i <= this._items.length; i++) {
    list.push({ videoUrl: this._items[i].content });
}

但是,如果 this._itemssampleItems 不同,您可以像访问任何数组一样访问 sampleItems 中的项目。 sampleItems[0] 为您提供数组中的第一个对象。在这种情况下是:

{ group: sampleGroups[0], content: "/video/vid.mp4"}

这个对象有两个属性“组”和“内容”,可以这样访问:

sampleItems[0].content

编辑:

您还需要修复您的 for 循环,这样就不会尝试访问大于其长度的索引处的数组。

for (var i = 0; i &lt; this._items.length; i++) {

【讨论】:

  • this._itemssampleItems 相同。当我说list.push({videoUrl: this._items[i].content}) 时,我收到一条错误消息:无法获取 undefinrd 或空引用的属性“内容”。
  • 您能否编辑问题并在创建 this._items 的位置添加更多信息?如果可能的话,在jsfiddle.net 上创建一个损坏代码的简单示例
  • 我现在明白了,您需要更改您的 for 循环,约束检查 for (var i = 0; i < this._items.length; i++) {
  • 谢谢,我没有注意到它创建了太多实例!问题仍然是我无法携带content 变量!它没有被检测到,我不确定如何声明它。
【解决方案2】:

如果我理解正确,那么您是 JavaScript 新手,不熟悉变量作用域的工作。

默认情况下,您在函数范围之外定义的任何内容都会添加到全局命名空间中,并且可以从项目中的任何文件中用于 JavaScript(只要它在相同的脚本上下文中运行 - 所以不在 iframe/webview 中)或 WebWorker)。

然而,最好(也是最常见)的做法是使用模块模式为每个 JS 文件创建一个文件范围。 WinJS 模板就是这样做的,因此您可能在不知不觉中遵循了这种模式。如果你这样做了,你的文件可能看起来像:

(function () {
// All your code
})();

结果是“所有你的代码”部分中的所有变量和函数都被限定在这个文件中。这是一件好事。

当你想暴露这个文件范围之外的东西时,你需要将它附加到某个地方的全局范围,以便它可以被其他地方运行的代码访问。最简单的方法是将其附加到全局“窗口”对象。所以,你可以写:

window.myVideoList = list;

然后 myVideoList 将在任何地方都可用(无论前面有或没有明确的“window.”)。

不过,这种事情的一个更好的模式是定义命名空间。这些实际上只是窗口外的对象,而这些对象又附加了更多对象(或更多命名空间对象)。由于看起来您正在使用 WinJS 库,因此您可以为此使用 WinJS.Namespace 工具。例如,在第一个文件的末尾(但在封闭函数范围内),您可以编写:

WinJS.Namespace.define("DataModel", {
    videoList: list,
});

然后在你写的其他文件中:

{ content: DataModel.videoList[0] } or whatever.

或者,或者,您可以公开一个“getVideoList”函数来构建和返回它,或者其他。

希望有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-25
    • 2017-05-06
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多