TypeScript with AngularJSをASP.Net MVCで使う デモ篇

[環境構築篇](http://qiita.com/laco0416/items/3d8083647c8f70a68597)からの続きです。

# サーバーサイドのAPIを作る
環境ができたのでまずサーバーサイドから作ります。今回は雰囲気をつかむためなのですごく適当なAPIを作ります。

```csharp:ValuesController.cs
namespace TypeScriptHTMLApp.Contollers
{

    public class Value
    {
        public string Text { get; set; }
    }

    public class ValuesController : ApiController
    {

        private static Value _Value { get; set; }

        public Value Get()
        {
            return _Value;
        }

        public HttpResponseMessage Post(Value value)
        {
            _Value = value;
            return Request.CreateResponse(HttpStatusCode.Created);
        }
    }
}
```

静的プロパティにアクセスするだけです。実際はここがDB操作になったりなんらかのデータ作成の処理になると思います。
今回は`Value`というモデルを使います。こいつはMVVMでいうとModelですね。
なんと素敵なことにサーバーサイドはこれで終わりです。ありがとうASP.Net WebAPI!!

# クライアントサイドを作る
まずはTypeScriptでMVVMのVMを作ります。好きなところにTypeScriptファイルを追加してください。名前も好みでいいですが、サンプルでは`MainController.ts`とします。解説はあとでするとして完成品がこちら

```ts:MainController.ts
module Main {

    export class Value {
        Text: string;
    }

    export interface Scope {
        value: Value;
        newText: string;
        setValue: Function;
    }

    export class Controller {
        private httpService: any;
        constructor($scope: Scope, $http: any) {
            this.httpService = $http;
            var controller = this;
            $scope.setValue = function () {
                var value = new Main.Value();
                value.Text = $scope.newText;
                controller.postValue(value, function (data) {
                    controller.getValue(function (data) {
                        $scope.newText = "";
                        $scope.value = data;
                    });
                });
            }
        }

        getValue(successCallback: Function) {
            this.httpService.get("/api/values").success(function (data, status) {
                successCallback(data);
            });
        }

        postValue(value: Value, successCallback: Function) {
            this.httpService.post("/api/values", value).success(function (data, status) {
                successCallback(data);
            });
        }
    }
}
```

`Main`モジュールに`Value`と`Scope`と`Controller`を宣言しています。
`Value`はサーバーサイドとの通信用のモデルです。
`Scope`はMVVMのVMに当たります。バインディング担当です。
`Controller`はその名の通りコントローラで、クライアント側の処理を担当します。

`Scope`には現在保持しているValueオブジェクト`value`と、input要素とバインディングする`newText`、ボタンをおした時の動作`setValue`が定義されています。
`Controller`は長いので読んで理解してもらいたいです。
constructor()はwindow.load時に呼ばれます（多分）。そしてそこでScopeのイベントハンドラを登録しています。getValueとpostValueはAPIを叩いているだけです。非同期なのでコールバック関数を渡してあげます。

最後に静的なhtmlファイルで枠組みを作りましょう。プロジェクトに最初から入ってるはずのdefault.htmを使います。
今回は`<input>`と`<button>`と`<h1>`だけのシンプルな形です。そこにバインディング用の属性を定義して、必要なjsファイルを読み込んで完成です。tsファイルはビルド後はjsファイルを吐き出すので、参照を間違わないようにしましょう。

```html:default.htm
<!DOCTYPE html>

<html lang="en" ng-app="">
<head>
    <meta charset="utf-8" />
    <title>TypeScript HTML App</title>
    <script src="../Scripts/angular.js" type="text/javascript"></script>
    <script src="MainController.js" type="text/javascript"></script>
</head>
<body>
    <div ng-controller="Main.Controller">
        <form ng-submit="setValue()">
            <input type="text" ng-model="newText">
            <button type="submit">Set</button>
        </form>
        <h1>{{value.Text}}</h1>
    </div>
</body>
</html>
```

これで実行すると、input要素に入力したテキストがボタンを押すと下に表示されるはずです。
だいぶ駆け足ですが、ASP.Net WebAPIと、TypeScript、AngularJSがVS2013で楽にかけるよ！という記事でした。ASP.Net MVCもっと流行れ！！