全局App变量保持未定义状态

时间:2014-06-12 22:56:32

标签: requirejs typescript kendo-mobile multi-device-hybrid-apps

好的一点背景,我正在尝试使用带有Visualcript的kendo-mobile使用Visual Studios新的多设备混合应用项目设置。我有一个名为main.ts的文件,其中包含以下代码:

/// <reference path="../typings/require.d.ts" />

import MyApplication = require('../app/MyApplication');
var App: MyApplication;   

document.addEventListener("deviceready", function ()
{    
   App = new MyApplication();
}, false);

剑道应用程序的初始化发生在MyApplication构造函数中。同样在同一构造函数中,我传入初始视图,以便kendo应用程序知道首先显示哪个视图。下面是MyApplication类的代码。

/// <reference path="../typings/require.d.ts" />

import PrimaryController = require("../app/controllers/PrimaryController");

class MyApplication
{
    KendoApp: kendo.mobile.Application;
    PrimaryController: PrimaryController;

    constructor()
    {
        this.InitializeControllers();
        this.InitializeKendoApp();
    }

    private InitializeControllers()
    {
        this.PrimaryController = new PrimaryController(this);
    }

    private InitializeKendoApp()
    {
        var appOptions: kendo.mobile.ApplicationOptions = {};
        appOptions.initial = this.PrimaryController.View;
        appOptions.layout = "app-layout";
        appOptions.transition = "slide";

        this.KendoApp = new kendo.mobile.Application($(document.body), appOptions);
    }
}

export = MyApplication;

所以在我的index.html中,我也调用了requirejs,它应该调用main.js并实例化我的全局App变量。

<script src="scripts/frameworks/require.js" data-main="scripts/app/main.js"></script>

现在我想在主div上显示(primaryview.html)我已经设置了data-show属性,如下所示:

data-show="App.PrimaryController.OnViewShow"

当数据显示属性存在时,我收到一条错误,上面写着&#34;无法读取&#39; PrimaryController&#39;未定义&#34; - 即我的全局App变量从未实例化。

如果我删除了数据显示属性,那么&#34;出现&#34; App变量实例化,因为primaryview.html按预期显示,如前所述,我在MyApplication的构造函数中设置初始视图。我唯一怀疑实例化是否发生是因为我在main.ts中设置了断点,但即使删除了数据显示并且显示了视图,它们也从未打过。

任何人都有任何关于这里发生的事情的想法?我想也许我需要在main.ts中包含对require.config()的调用,并且我尝试使用google搜索中找到的示例来设置它,但没有任何效果。

1 个答案:

答案 0 :(得分:3)

只要您创建导入语句,您的文件就会被包含在define中,并且文件中的全局变量不再是全局,即可用于window所以:

import MyApplication = require('../app/MyApplication');
var App: MyApplication;  

应用程序不在窗口中。

您可以执行以下操作但是要放入窗口:

document.addEventListener("deviceready", function ()
{    
   (<any>window).App = new MyApplication();
}, false);