将 JsObservable 与 TypeScript 结合使用

问题描述 投票:0回答:1

我过去已经使用过 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

文件:~/index.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>

文件:~/tmpl/options.tmpl.html

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

文件:app.ts

/// <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();
};

文件:game.ts

/// <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();
    }
}

接下来我可以尝试什么?

javascript typescript jsrender jsviews
1个回答
2
投票

TypeScript 希望您使用 ES6 导入语句,即:

import * as jQuery from 'jquery';
另一种方法是在模块加载器中引用脚本(例如 jquery),然后使用
declare const jQuery: any
在整个应用程序中使用。另一种方法是引用 tsconfig 中的类型:

使用 import 语句的第一种方法:

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();
}

}

使用 TSConfig:

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

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

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

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

我还建议不要使用引用路径,因为 TypeScript 都是关于类型的。大多数模块(从我迄今为止所看到的来看)都带有一个类型文件。然而,例如 jQuery 则不然。因此,在执行

npm install jquery
之后,您需要通过运行
npm install @types/jquery --save-dev

来额外安装它的类型
© www.soinside.com 2019 - 2024. All rights reserved.