1

从 main.ts 入口点运行的 bootstrapper.ts 看起来像这样(减去引用标题):

import Dialogs = App.Widgets.Dialogs;
declare var $ : JQueryStatic;


export class Bootstrapper { 
    static SiteLoad() { 
       var dialog = new Dialogs.LoginDialog();
       ...
    }
}

但是,当 main.ts 尝试加载此文件时,第一行会立即引发引用错误。那时我意识到导入内部模块不会将任何依赖项添加到define生成的 .js 文件的包装器中。

那么如何在运行时解析内部模块呢?是不是 AMD 只与外部模块兼容,而我必须在 main.ts 的入口点加载内部模块以及外部库?

我更喜欢内部模块的别名语法而不是外部模块。我上面的代码看起来比使用外部模块语法时要干净得多:

import Dialogs = module("Modules/App.Widgets.Dialogs");
declare var $ : JQueryStatic;


export class Bootstrapper { 
    static SiteLoad() { 
       var dialog = Dialogs.App.Widgets.Dialogs.LoginDialog(); //Seriously?
       ...
    }
}

那只是丑陋。该怎么办?

更新:

史蒂夫,你建议的方法有局限性。在我使用内部模块的原始方法中,我可以执行以下操作:

import Dialogs = App.Widgets.Dialogs;

declare var $ : JQueryStatic;

export class Bootstrapper { 
    static SiteLoad() { 

        var loginDialog1 = new Dialogs.LoginDialog();  //Instantiation      -OK
        var loginDialog2: Dialogs.LoginDialog;         //Type-Declaration   -OK
    }
}

在您建议的方法中,我失去了使用别名进行类型声明的能力:

import DialogsModule =  module("Modules/App.Widgets.Dialogs");

var Dialogs : DialogsModule.App.Widgets.Dialogs;

declare var $ : JQueryStatic;

export class Bootstrapper { 
    static SiteLoad() { 

        var loginDialog1 = new Dialogs.LoginDialog();   //Instantiation  -OK        
        var loginDialog2: Dialogs.LoginDialog;  //Type-Declaration -ERROR: The name "Dialogs" does not exist in the current context  
        var loginDialog3: DialogsModule.App.Widgets.Dialogs.LoginDialog;  //Must use full name instead
    }
}
4

1 回答 1

2

您可以像这样为长模块路径起别名:

import DialogModule = module("Modules/App.Widgets.Dialogs");
var dialogs = DialogModule.App.Widgets.Dialogs;
declare var $ : JQueryStatic;

export class Bootstrapper { 
    static SiteLoad() { 
       var dialog = dialogs.LoginDialog();
       ...
    }
}

您可以通过自己包含适当的文件来将 AMD 与纯 JavaScript 混合使用——但我建议您选择一种模式在您的程序中使用,以使事情更易于理解。

于 2013-01-21T09:30:46.267 回答