【问题标题】:How to load Jquery plugin via AMD module with Typescript如何使用 Typescript 通过 AMD 模块加载 Jquery 插件
【发布时间】:2012-11-11 19:32:39
【问题描述】:

我可以使用这样的 AMD 模块加载 jQuery - require jquery via AMD in TypeScript 我也了解插件如何在没有模块的情况下修改 jquery 界面 - Using jQuery plugin in TypeScript

但是如何通过 AMD 模块加载 jQuery 插件?并更新了 jQuery 界面?

import plugin1 = module("jquery.tmpl");
import jQuery= module("jquery");

plugin1 和 jQuery 都会有不同版本的 jQuery 接口,plugin1 不会添加到 jquery 模块中定义的接口。

我尝试将每个文件中的模块命名为相同

export module jQuery {
   // .., jQuery definitions
}

但是还是不行

【问题讨论】:

    标签: jquery typescript js-amd


    【解决方案1】:

    Typescript 不会导入模块,除非它们导出某些内容并且除非您直接使用它们导出的内容,但是对于像 JQuery 插件这样简单地将新方法添加到 $.解决方案是使用 here 中记录的 amd-dependency 标志。

    在文件顶部添加这样一行:

    ///<amd-dependency path="jgrowl" />
    

    这将强制 Typescript 将其列在已编译 Javascript 的 define 调用中。您还需要在 require.config 中为您的插件设置路径和填充程序,如下所示:

    require.config({
      paths: {
        jquery: "external/jquery-2.1.1",
        jgrowl: "external/jquery.jgrowl-1.4.0.min",
      },
      shim: {
        'jgrowl': { deps: ['jquery'] },
      }
    });
    

    【讨论】:

    • 这仍然是导入我不想直接使用的 jQuery 插件的正确解决方案吗?它仍然有效,因此得到了支持 - 只是想知道此时是否有不同的首选方法。
    【解决方案2】:

    将以下内容添加到github/definetelytyped 上的 jquery.d.ts 文件的末尾。

    declare module "jquery"{ 
     /****
     AJAX
    *****/
    export function ajax(settings: JQueryAjaxSettings): JQueryXHR;
    export function ajax(url: string, settings?: JQueryAjaxSettings): JQueryXHR;
    
    export function  ajaxPrefilter(dataTypes: string, handler: (opts: any, originalOpts: any, jqXHR: JQueryXHR) => any): any;
    export function ajaxPrefilter(handler: (opts: any, originalOpts: any, jqXHR: JQueryXHR) => any): any;
    
    export var ajaxSettings: JQueryAjaxSettings;
    
    export function ajaxSetup(options: any);
    
    export function get(url: string, data?: any, success?: any, dataType?: any): JQueryXHR;
    export function getJSON(url: string, data?: any, success?: any): JQueryXHR;
    export function getScript(url: string, success?: any): JQueryXHR;
    
    export function param(obj: any): string;
    export function param(obj: any, traditional: bool): string;
    
    export function post(url: string, data?: any, success?: any, dataType?: any): JQueryXHR;
    
    /*********
     CALLBACKS
    **********/
    export function Callbacks(flags?: string): JQueryCallback;
    
    /****
     CORE
    *****/
    export function holdReady(hold: bool): any;
    export function (selector: string, context?: any): JQuery;
    export function (element: Element): JQuery;
    export function (object: { }): JQuery;
    export function (elementArray: Element[]): JQuery;
    export function (object: JQuery): JQuery;
    export function (func: Function): JQuery;
    export function (array: any[]): JQuery;
    export function (): JQuery;
    
    export function noConflict(removeAll?: bool): Object;
    
    export function when(...deferreds: any[]): JQueryPromise;
    
    /***
     CSS
    ****/
    export function css(e: any, propertyName: string, value?: any);
    export function css(e: any, propertyName: any, value?: any);
    export var cssHooks: { [key: string]: any; };
    export var cssNumber: any;
    
    /****
     DATA
    *****/
    export function data(element: Element, key: string, value: any): any;
    export function data(element: Element, key: string): any;
    export function  data(element: Element): any;
    
    export function dequeue(element: Element, queueName?: string): any;
    
    export function hasData(element: Element): bool;
    
    export function queue(element: Element, queueName?: string): any[];
    export function queue(element: Element, queueName: string, newQueueOrCallback: any): JQuery;
    
    export function removeData(element: Element, name?: string): JQuery;
    
    /*******
     EFFECTS
    ********/
    export var fx: { tick: () => void; interval: number; stop: () => void; speeds: { slow: number; fast: number; }; off: bool; step: any; };
    
    /******
     EVENTS
    *******/
    export function proxy(context: any, name: any): any;
    export function Deferred(): JQueryDeferred;
    
    /*********
     INTERNALS
    **********/
    export function error(message: any);
    
    /*************
     MISCELLANEOUS
    **************/
    export var expr: any;
    export var fn: any;  //TODO: Decide how we want to type this
    export var  isReady: bool;
    
    /**********
     PROPERTIES
    ***********/
    export var browser: JQueryBrowserInfo;
    export var support: JQuerySupport;
    
    /*********
     UTILITIES
    **********/
    export function contains(container: Element, contained: Element): bool;
    
    export function each(collection: any, callback: (indexInArray: any, valueOfElement: any) => any): any;
    
    export function extend(target: any, ...objs: any[]): Object;
    export function extend(deep: bool, target: any, ...objs: any[]): Object;
    
    export function globalEval(code: string): any;
    
    export function grep(array: any[], func: any, invert: bool): any[];
    
    export function inArray(value: any, array: any[], fromIndex?: number): number;
    
    export function isArray(obj: any): bool;
    export function isEmptyObject(obj: any): bool;
    export function isFunction(obj: any): bool;
    export function isNumeric(value: any): bool;
    export function isPlainObject(obj: any): bool;
    export function isWindow(obj: any): bool;
    export function isXMLDoc(node: Node): bool;
    
    export function makeArray(obj: any): any[];
    
    export function map(array: any[], callback: (elementOfArray: any, indexInArray: any) =>any): JQuery;
    
    export function merge(first: any[], second: any[]): any[];
    
    export function noop(): any;
    
    export function now(): number;
    
    export function parseJSON(json: string): Object;
    
    //FIXME: This should return an XMLDocument
    export function parseXML(data: string): any;
    
    export function queue(element: Element, queueName: string, newQueue: any[]): JQuery;
    
    export function trim(str: string): string;
    
    export function type(obj: any): string;
    
    export function unique(arr: any[]): any[];
    }
    

    然后只需使用:

    import $ = module("jquery");
    

    这假定您的 jquery js 文件位于同一目录中并命名为 jquery.js。您可以在my blog 的下载部分看到我的示例。

    【讨论】:

    • 我正在工作的那部分。问题是如何将 jQuery 插件作为模块导入,以便使用插件方法扩展 $。
    • 对不起亚当。多任务处理会扼杀对那个的理解。
    【解决方案3】:

    您需要使用导入语句加载它并添加带有引用的定义文件。

    ///<reference path="jquery.templ.d.ts" />
    
    import plugin = module("jquery.templ");
    

    【讨论】:

    • 这似乎对我不起作用,jQuery 界面没有扩展。 jquery.templ.d.ts 文件是什么样的?是导出自己的模块名还是在jquery模块名下导出?
    • 通常jquery定义只是添加到jquery接口...即interface JQuery { myThing: myType; }
    • 更新了问题,当使用模块时(即 jQuery 定义被包装在导出模块 jQuery {} 中)接口没有得到扩展,你最终会得到两个单独的 jQuery 接口
    • 我不会将它们包装在 jQuery 模块中 - jQuery 是 jquery.d.ts 中的一个接口,所以我会扩展该接口。
    • 这也不起作用,因为扩展仍然在插件变量中定义,jquery 变量包含原始未扩展版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 2018-01-11
    • 1970-01-01
    • 2013-10-28
    相关资源
    最近更新 更多