137

KnockoutJS で TypeScript を使用するサンプルはありますか? 彼らがどのように連携するのか、私はただ興味がありますか?

編集

これが私が持っているものです、うまくいくようです

declare var ko: any;
declare var $: any;
class ViewModel {
    x = ko.observable(10);
    y = ko.observable(10);

}

$(() => {
    ko.applyBindings(new ViewModel());
});

これにより、次の Javascript が生成されます。

var ViewModel = (function () {
    function ViewModel() {
        this.x = ko.observable(10);
        this.y = ko.observable(10);
    }
    return ViewModel;
})();
$(function () {
    ko.applyBindings(new ViewModel());
});
4

6 に答える 6

108

FixedTyped を見てください

「人気のある JavaScript ライブラリの TypeScript 型定義リポジトリ」

于 2012-10-26T10:46:49.487 に答える
58

Knockout の静的型を取得するために、この小さなインターフェイスを作成しました。

interface ObservableNumber {
        (newValue: number): void;               
        (): number;                             
        subscribe: (callback: (newValue: number) => void) => void;
}
interface ObservableString {
        (newValue: string): void;               
        (): string;                             
        subscribe: (callback: (newValue: string) => void) => void;
}
interface ObservableBool {
    (newValue: bool): void;             
    (): bool;                               
    subscribe: (callback: (newValue: bool) => void) => void;
}

interface ObservableAny {
    (newValue: any): void;              
    (): any;                                
    subscribe: (callback: (newValue: any) => void) => void;
}

interface ObservableStringArray {
    (newValue: string[]): void;
    (): string[];
    remove: (value: String) => void;
    removeAll: () => void;
    push: (value: string) => void;
    indexOf: (value: string) => number;
}

interface ObservableAnyArray {
    (newValue: any[]): void;
    (): any[];
    remove: (value: any) => void;
    removeAll: () => void;
    push: (value: any) => void;
}

interface Computed {
    (): any;
}

interface Knockout {
    observable: {
        (value: number): ObservableNumber;
        (value: string): ObservableString;
        (value: bool): ObservableBool;
        (value: any): ObservableAny;
    };
    observableArray: {
        (value: string[]): ObservableStringArray;
        (value: any[]): ObservableAnyArray;
    };
    computed: {
        (func: () => any): Computed;
    };
}

「Knockout.d.ts」に入れて、自分のファイルから参照します。ご覧のとおり、ジェネリック (仕様に従って提供されます) から大きなメリットが得られます。

ko.observable() のインターフェースをいくつか作っただけですが、ko.computed() と ko.observableArray() は同じパターンで簡単に追加できます。更新: subscribe() の署名を修正し、computed() と observableArray() の例を追加しました。

独自のファイルから使用するには、これを先頭に追加します。

/// <reference path="./Knockout.d.ts" />
declare var ko: Knockout;
于 2012-10-02T14:23:05.593 に答える
14

TypeScript インターフェイス宣言の私の実現を試してください (簡単な例で)
https://github.com/sv01a/TypeScript-Knockoutjs

于 2012-10-05T05:47:16.050 に答える
6

ノックアウト バインディングがマークアップで宣言される方法に関しては何も変わりませんが、インターフェースがノックアウト ライブラリ用に記述されると、インテリセンスの利点が得られます。この点で、ほとんどの jQuery api のインターフェースを含む typescript ファイルを持つjquery Sampleと同じように機能します。

ko と $ の 2 つの変数宣言を取り除けば、コードは機能すると思います。これらは、ノックアウト スクリプトと jquery スクリプトがロードされたときに作成された実際の ko 変数と $ 変数を隠しています。

Visual Studio テンプレート プロジェクトをノックアウトに移植するには、次のようにする必要がありました。

app.ts:

class GreeterViewModel {
    timerToken: number;
    utcTime: any;

    constructor (ko: any) { 
        this.utcTime = ko.observable(new Date().toUTCString());
        this.start();
    }

    start() {
        this.timerToken = setInterval(() => this.utcTime(new Date().toUTCString()), 500);
    }
}

window.onload = () => {
    // get a ref to the ko global
    var w: any;
    w = window;
    var myKO: any;
    myKO = w.ko;

    var el = document.getElementById('content');
    myKO.applyBindings(new GreeterViewModel(myKO), el);
};

default.htm:

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title>TypeScript HTML App</title>
    <link rel="stylesheet" href="app.css" type="text/css" />
    <script src="Scripts/knockout-2.1.0.debug.js" type="text/javascript"></script>
    <script src="app.js"></script>
</head>
<body>
    <h1>TypeScript HTML App</h1>

    <div id="content" data-bind="text: utcTime" />
</body>
</html>
于 2012-10-02T14:02:45.937 に答える
2

私はhttps://www.nuget.org/packages/knockout.editables.TypeScript.DefinitelyTyped/ を使用しており、Knockout 用のすべてのインターフェイスを備えています。

于 2015-08-17T11:34:19.830 に答える