TypeScript accomplish MVVM pattern(TypeScript实现MVVM)

Hello Everyone, 经过上一篇“野蛮”的创建了个TypeScript版的windows store app,这次我们再用这个来实现MVVM模型吧,虽然TypeScript技术比较新潮,但仔细想想,其实也不会非常的困难,相反却提供了很多便利。它和C#语言有太多的相似之处,毕竟是同一个大牛开发出来的嘛。话不多说,开始实行吧。

1. 目前我创建了一个非常干净的项目,都是些默认的文件,唯一动过的default.ts也是空的。


2. 现在我们需要添加lib, winjs, winrt的Typescript定义,借用一下Rachel Appel在新型应用程序中使用 TypeScript的一段话


下面我们要添加这些声明文件了,好在VS库里有现成,如果手动添加再编辑内容的话,那不知道要写到猴年马月了。我们可以去上面图片上的地址去下载或者去这个地址TypeScript CodePlex,也可以自己安装,打开工具->Nuget程序包管理器->管理解决方案的NuGet包(N)...或者鼠标右键点击当前项目,我们也可以看到菜单“管理解决方案的NuGet包(N)...”,然后我们会看到如下对话框


在搜索栏里键入“tag:typescript winjs”,找到它的包然后点击安装,安装完之后会看到项目里增加了相应的文件夹和文件


然后继续在搜索栏里键入“tag:typescript jquery”来安装Jquery的包,如果未能用此方法找到lib.d.ts的话,我们可以去TypeScript CodePlex下载,而这次我们也需要knockout库的函数来实现绑定,因此还需要knockout的声明,可以用同样的方法“tag:typescript knockout”来安装。

这些库的声明是完成了,但是没有实现的代码怎么能行呢,所以现在我们要下载安装Jquery和Knockout的真正实现的文件了,这样我们TypeScript的声明才有效,才能用。

下面打开工具->NuGet程序包管理器->程序包管理器控制台

在程序包管理器控制台分别键入“install-package jquery” 和“install-package knockoutjs”来安装Jquery和Knockout,我们会看到项目的Script文件夹多了一些js文件,这些js文件就实现了Jquery和Knockout的机制。


好了,所有的准备工作已经做完,现在开始实现我们的MVVM了。

1.首先添加一个程序入口文件,这里我将js/default.ts作为入口,这相当于C#版里的App.cs或者WinForm程序的Program.cs。添加如下代码

///<reference path='..\Scripts\typings\winjs\winjs.d.ts'/>
///<reference path='..\Scripts\typings\winrt\winrt.d.ts'/>

module Default {
    "use strict";
    var app = WinJS.Application;
    var activation = Windows.ApplicationModel.Activation;
    var nav = WinJS.Navigation;
    //WinJS.strictProcessing();


    app.addEventListener("activated", function (args: any) {
        if (args.detail.kind === activation.ActivationKind.launch) {
            var launchEv = <Windows.ApplicationModel.Activation.LaunchActivatedEventArgs>args.detail;

            if (args.detail.previousExecutionState !== activation.ApplicationExecutionState.terminated) {
                // TODO: This application has been newly launched. Initialize
                // your application here.
            } else {
                // TODO: This application has been reactivated from suspension.
                // Restore application state here.
            }
        }
    });

    app.oncheckpoint = function (args) {
        // TODO: This application is about to be suspended. Save any state
        // that needs to persist across suspensions here. If you need to 
        // complete an asynchronous operation before your application is 
        // suspended, call args.setPromise().
        app.sessionState.history = nav.history;
    };

    app.start();
}
2.添加viewModel文件夹和相应的viewModel,这里我创建了一个mainViewModel.ts。并添加如下代码

///<reference path='..\Scripts\typings\knockout\knockout.d.ts'/>

module TypeScriptApp.viewModels {
    export class mainViewModel {

        // The said words. Binded in view.
        public words = ko.observable<string>();

        constructor() {

        }

        /**
         * Mehtod for saying.
         */
        public say(): void {
            this.words("Hello!");

            var messageDialog = new Windows.UI.Popups.MessageDialog("Hello!");
            messageDialog.showAsync();
        }
    }
}


3.添加views文件夹,我将default.html更名为mainView.html,让MVVM看起来更和谐些。下面我们要做的是为mainView.html添加codebehind的ts文件,为其绑定mainViewModel.ts。

1)重命名和移动文件后,记得要修改package.appxmanifest文件,将其起始页改为views\mainView.html

2)为mainView.html添加codebehind文件,mainView.html.ts,并添加如下代码

///<reference path='..\Scripts\typings\winjs\winjs.d.ts'/>
///<reference path='..\Scripts\typings\winrt\winrt.d.ts'/>
///<reference path='..\Scripts\typings\knockout\knockout.d.ts'/>

module TypeScriptApp.views {
    "use strict"

    var appView = Windows.UI.ViewManagement.ApplicationView;
    var appViewState = Windows.UI.ViewManagement.ApplicationViewState;
    var nav = WinJS.Navigation;
    var ui = WinJS.UI;

    ui.Pages.define("/views/mainView.html", {
        ready: function (element, options) {
            ko.applyBindings(new TypeScriptApp.viewModels.mainViewModel(), element);
        },
    });
}
可能你会觉得mainView.html和mainView.html.ts被分开的放在views文件夹中会影响美观和冗余,我们可以更改项目文件把他们整合起来,只要找到mainView.html.ts的节点并改成如下格式即可

    <TypeScriptCompile Include="views\mainView.html.ts" >
      <DependentUpon>mainView.html</DependentUpon>
    </TypeScriptCompile>

看此时两个文件整合起来了



3)下面我们来修改mainView.html,来绑定viewmModel里的属性和事件。

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta charset="utf-8" />
    <title>TypeScriptApp</title>

    <!-- WinJS 引用 -->
    <link href="//Microsoft.WinJS.2.0/css/ui-dark.css" rel="stylesheet" />
    <script src="//Microsoft.WinJS.2.0/js/base.js"></script>
    <script src="//Microsoft.WinJS.2.0/js/ui.js"></script>

    <!-- TypeScriptApp 引用 -->
    <link href="/css/default.css" rel="stylesheet" />
    <script src="/js/default.js"></script>

    <script src="/Scripts/knockout-3.2.0.js"></script>
    <script src="/Scripts/jquery-2.1.1.js"></script>

    <script src="/views/mainView.html.js"></script>
    <script src="/viewModels/mainViewModel.js"></script>
</head>
<body>
    <div>
        <div>
            <h2>You have said: </h2>
            <h2 data-bind="text:words"></h2>
        </div>
        <div>
            <label>Say:</label>
            <input type="text" data-bind="value:words"/>
        </div>
        <button data-bind="event: { click: say} ">Say</button>
    </div>
</body>
</html>

这里要注意引用script文件


我们引用的是js文件而不是ts文件,因为ts文件最终编译生成js文件,真正有效的最后还是js文件,我们不用刻意去添加相应的js文件,只要这样引用就可以了。

最后运行一下程序


虽然界面有点丑,但总算是把MVVM给实现了啊。

源代码下载:http://download.csdn.net/detail/leyyang/7984687

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值