代码之家  ›  专栏  ›  技术社区  ›  ClaudeVernier

需要帮助使用JsObservable with TypeScript吗?

  •  2
  • ClaudeVernier  · 技术社区  · 7 年前

    我过去已经使用过JSRender、JSViews和JSObservables。这一次,我开始了一个新的项目,但使用的是TypeScript,我不知道如何使用它。。。我发现把参考文献放在哪里很困惑。js。d、 ts。ts。。。

    我的“脚本”文件夹包含以下文件:

    ~\Typings\jQuery\jQuery.d.ts
    installed from this NuGet package: jquery.TypeScript.DefinitelyTyped v0.0.1
    
    ~\Typings\jsrender\jsrender.d.ts   
    installed from this NuGet package: jsrender.TypeScript.DefinitelyTyped v0.1.8
    

    文件:~/索引。html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <script src="scripts/jquery-3.1.1.js"></script>
        <script src="scripts/jsviews.js"></script>
        <script src="scripts/game/game.js"></script>
        <script src="scripts/game/app.js"></script>
    </head>
    <body>
        <div id="view">
            <div id="myMap"></div>
            <div id="optionsTmpl"></div>
        </div>
    </body>
    </html>
    

    <div class="optionsFrame">
        <select data-link="mapType">
        {^{for mapTypes}}
            <option value="{{:id}}">{{:name}}</option>
        {{/for}}
        </select>
        <input type="button" value="test">
    </div>
    

    文件:应用程序。输电系统

    /// <reference path="../typings/jquery/jquery.d.ts" />
    /// <reference path="../typings/jsrender/jsrender.d.ts" />
    class UnchartedApp {
        game: UnchartedGame;
    
        init() {
            this.game = new UnchartedGame();
            this.game.loadMap();
        }
    }
    
    window.onload = () => {
        var app = new UnchartedApp();
        app.init();
    };
    

    文件:游戏。输电系统

    /// <reference path="../typings/jquery/jquery.d.ts" />
    /// <reference path="../typings/jsrender/jsrender.d.ts" />
    class UnchartedGame {
        constructor() {
        }
    
    
        /*****      Error on the $.observe() line !!    *****/
        loadMap() {
            this.linkTemplate("options", "#optionsTmpl", this).done(function (currentGame) {
                $.observe(currentGame, "*", currentGame.modelChangeHandler);
            });
        }
    
        modelChangeHandler(ev, eventArgs) {
            if (ev.type == "propertyChange") {
                var _game: UnchartedGame = ev.currentTarget;
                if (eventArgs.path == "mapType") {
                    try {
                        _game.myMap.setMapType(mapTypeNames[newValue]);
                    }
                    catch (ex) {
                    }
                }
            }
        }
    
        loadTemplate(tmplName: string) {
            var deferredLoad = $.Deferred();
            try {
                var filePath: string = "../tmpl/" + tmplName + ".tmpl.html";
                $.get(filePath).then(function (templateText) {
                    $.templates(tmplName, templateText);
                    deferredLoad.resolve();
                })
            }
            catch (e) {
                deferredLoad.reject();
            }
            return deferredLoad.promise();
        }
    
        linkTemplate(tmplName: string, targetId: string, model: UnchartedGame) {
            var deferredLink = $.Deferred();
            try {
                this.loadTemplate(tmplName).done(
                function () {
                    $.templates[tmplName].link(targetId, model);
                    deferredLink.resolve(model);
                });
            }
            catch (e) {
                deferredLink.reject();
            }
            return deferredLink.promise();
        }
    }
    

    谢谢和问候,

    克劳德

    1 回复  |  直到 7 年前
        1
  •  2
  •   mwilson    7 年前

    TypeScript希望您使用ES6导入语句,即: import * as jQuery from 'jquery'; 另一种方法是在模块加载器中引用脚本(例如jquery),然后使用 declare const jQuery: any 在整个应用程序中使用。另一种方法是引用tsconfig中的键入:

    使用导入语句的第一种方法:

    import * as jQuery from 'jquery'; // jquery installed via npm install jquery
    import * as jsrender from 'jsrender'; // jsrender installed via npm install jsrender
    
    // === OR ===
    
    declare const jQuery: any; // Reference the script in your module loader/html
    declare const jsrender: any; // Reference the script in your module loader/html
    
    class UnchartedGame {
        constructor() {
        }
    
    
    /*****      Error on the $.observe() line !!    *****/
    loadMap() {
        this.linkTemplate("options", "#optionsTmpl", this).done(function (currentGame) {
            $.observe(currentGame, "*", currentGame.modelChangeHandler);
        });
    }
    
    modelChangeHandler(ev, eventArgs) {
        if (ev.type == "propertyChange") {
            var _game: UnchartedGame = ev.currentTarget;
            if (eventArgs.path == "mapType") {
                try {
                    _game.myMap.setMapType(mapTypeNames[newValue]);
                }
                catch (ex) {
                }
            }
        }
    }
    
    loadTemplate(tmplName: string) {
        var deferredLoad = $.Deferred();
        try {
            var filePath: string = "../tmpl/" + tmplName + ".tmpl.html";
            $.get(filePath).then(function (templateText) {
                $.templates(tmplName, templateText);
                deferredLoad.resolve();
            })
        }
        catch (e) {
            deferredLoad.reject();
        }
        return deferredLoad.promise();
    }
    
    linkTemplate(tmplName: string, targetId: string, model: UnchartedGame) {
        var deferredLink = $.Deferred();
        try {
            this.loadTemplate(tmplName).done(
            function () {
                $.templates[tmplName].link(targetId, model);
                deferredLink.resolve(model);
            });
        }
        catch (e) {
            deferredLink.reject();
        }
        return deferredLink.promise();
    }
    

    {
      "compilerOptions": {
        "types": ["jquery", "jsrender"]
      }
    }
    

    另一种可能的方法是转到主模块并使用以下行:

    import 'jquery'; // jquery installed via npm install jquery

    我注意到这就是我在我的一个项目中使用它的方式(必需的@types文件)。

    我还建议不要使用引用路径,因为TypeScript都是关于类型的。大多数模块(从我目前看到的情况来看)都带有一个打字文件。然而,以jQuery为例,情况并非如此。那么,在你这么做之后 npm install jquery npm install @types/jquery --save-dev