如何使用jQuery,RequireJS和KnockoutJS创建基本的TypeScript项目

时间:2014-09-18 23:56:43

标签: javascript mvvm knockout.js requirejs typescript

我一直在寻找一个简单的操作方法,使用RequireJS,jQuery和KnockoutJS创建Visual Studio 2012 TypeScript项目的最基本示例。有几个可用的例子,但对我来说,有些比我想要的更复杂,所以我开始创建一个方法,并将其发布在这里供公众审查。我已经回答了我自己的问题,作为Q& A风格的知识共享练习。

对于那些不熟悉的人,这里是所包含组件的快速细分......

TypeScript - 一个Visual Studio扩展,允许脚本通过JavaScript的超集语言创建.TS文件。这提供了定义与方法和变量相关联的数据类型的能力 - 否则JavaScript将丢失这些数据类型。通过这样做,编译时间检查可以确保正确使用以尝试减少运行时冲突。构建Visual Studio项目时,Visual Studio扩展会将脚本编译为实际的JavaScript。因此,这个扩展附带了它自己的编译器--tsc.exe。预计生成的JavaScript文件将部署到生产环境,而不是源代码.ts文件。

jQuery - 用于HTML文档遍历和操作,事件处理,动画和Ajax交互的JavaScript框架。

RequireJS - 依赖加载器。有时JavaScript引用会变得疯狂。这试图帮助解决这些问题。我的示例显示,即使使用了许多JavaScript文件,HTML也仅指一个 - 加载其他文件的根JavaScript文件。

KnockoutJS - 利用MVVM模式进行UI绑定。 HTML视图引用视图模型中的变量和方法。视图模型是一个JavaScript对象(JavaScript文件可能是编译.ts文件的结果 - 请参阅上面的TypeScript。)

DefinitelyTyped - 还包括两个DefinitelyTyped NuGet包。由于TypeScript正在尝试验证数据类型的使用情况,因此它正在执行检查以确保它知道所有引用。 JavaScript比这更松散。为了满足TypeScript(当引用外部JavaScript对象时),我们需要一种方法来描述(对TypeScript)我们期望使用的对象。这些DefinitelyTyped脚本提供了此定义。它们不提供任何功能,只是TypeScript编译器的清晰度,因此它可以执行这些检查。

在下面的示例中,您将看到

/// <reference path="../Scripts/typings/requirejs/require.d.ts" />

这是TypeScript编译器将包含requirejs DefinitelyTyped定义文件的方式。创建这些DefinitelyTyped脚本的组织创建了一个庞大的集合。这里我们只提到两个 - KnockoutJS和RequireJS(好吧,因为这是本教程的范围)

1 个答案:

答案 0 :(得分:37)

声明

此操作方法将显示使用TypeScript,jQuery,KnockoutJS和RequireJS构建基本网站的 “a” 方式。还有很多其他方法可以做到。

入门

安装Visual Studio扩展程序

安装Visual Studio 2012扩展 - 适用于Microsoft Visual Studio 2012 PowerTool 1.0.1.0的TypeScript http://visualstudiogallery.msdn.microsoft.com/ac357f1e-9847-46ac-a4cf-520325beaec1


创建新的Visual Studio项目

  • 启动visual studio 2012。
  • 选择菜单项“文件” - &gt;“” - &gt;“项目 ...”
  • 导航至“模板” - &gt;“其他语言” - &gt;“ TypeScript ”(此 实际上创建了一个扩展名为.csproj的项目文件 - 怪异的)
  • 选择项目类型“使用TypeScript的HTML应用程序”

清理

从项目中删除文件app.css,app.ts


添加组件

使用NuGet,添加...

  • RequireJS (我在本教程中选择了2.1.15版本)
  • KnockoutJS (我为本教程选择了3.2.0版)
  • jQuery (我为本教程选择了2.1.1版本)
  • requirejs.TypeScript.DefinitelyTyped (我选择的版本0.2.0由
    Jason Jarrett为本教程。它安装了一个打字稿def文件 作者:Josh Baldwin - 版本2.1.8)
  • knockout.TypeScript.DefinitelyTyped (我选择版本0.5.7 by
    本教程的Jason Jarrett)

设置项目文件夹

在项目根目录下创建项目文件夹

  • 应用
  • 模型
  • 的ViewModels

创建基本的TypeScript模型

将TypeScript文件添加到项目文件夹“Models”

  • 右键单击解决方案资源管理器
  • 中的“模型”文件夹
  • 选择上下文菜单项“添加” - &gt;“新项目...”
  • 在左侧窗格中,突出显示“Visual C#”
  • 在右侧窗格中,突出显示“TypeScript文件”
  • 在文件名文本框中,输入“myTestModel.ts”单击“添加”按钮

修改文件“myTestModel.ts”

class myTestModel {
    public fieldZ: string;
    public fieldY: string;
    public fieldX: number;
}
export=myTestModel;

创建TypeScript视图模型

将TypeScript文件添加到项目文件夹“ViewModels”

  • 在解决方案资源管理器
  • 中右键单击“ViewModels”文件夹
  • 选择上下文菜单项“添加” - &gt;“新项目...”
  • 在左侧窗格中,突出显示“Visual C#”
  • 在右侧窗格中,突出显示“TypeScript文件”
  • 在文件名文本框中,输入“myViewModel.ts”
  • 点击“添加”按钮

修改文件myViewModel.ts ...

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

import myTestModel = require("Models/myTestModel");
import ko = require("knockout");

class myViewModel {
    public myString: KnockoutObservable<string>;
    public myNumber: KnockoutObservable<number>;
    public myComplexObject: KnockoutObservable<myTestModel>;

    constructor() {
        this.myString = ko.observable("some test data");
        this.myNumber = ko.observable(987);

        var tempComplexObject = new myTestModel;
        tempComplexObject.fieldZ = "some bogus test data";
        tempComplexObject.fieldY = "another bogus test data";
        tempComplexObject.fieldX = 123;

        this.myComplexObject = ko.observable(tempComplexObject);
    }

    myButton_Click() {
        alert("I was clicked");
    }
}
export=myViewModel;

添加配置

添加RequireJS配置文件

  • 在解决方案资源管理器
  • 中右键单击项目文件夹“Application”
  • 选择上下文菜单项“添加” - &gt;“新项目...”
  • 在左侧窗格中,突出显示“Visual C#”
  • 在右侧窗格中,突出显示“TypeScript文件”
  • 在文件名文本框中,输入“require-config.ts”
  • 点击“添加”按钮

修改文件“require-config.ts”

/// <reference path="../Scripts/typings/requirejs/require.d.ts" />

require.config({
    baseUrl: "",
    paths: {
        "jQuery": "Scripts/jquery-2.1.1",
        "knockout": "Scripts/knockout-3.2.0.debug",
        "myViewModel": "ViewModels/myViewModel"
    },
    shim: {
        "jQuery": {
            exports: "$"
        }
    },
});

require(["jQuery"], function ($) {
    $(document).ready(function () {
        require(["knockout", "myViewModel"], (knockout, myViewModel) => {
            var viewModel = new myViewModel;
            knockout.applyBindings(viewModel);
        });
    });
});

修改现有文件index.html

需要将视图与视图模型对齐。

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8" />
        <title>TypeScript HTML App</title>
        <script data-main="Application/require-config" src="Scripts/require.js"></script>
    </head>
    <body>
        <h1>TypeScript HTML App</h1>

        <div id="myStringTest" data-bind="text: myString"></div>
        <input id="myStringTest2" data-bind="value: myString" />
        <input id="myNumberTest" data-bind="value: myNumber" />
        <input id="myComplexObjectTest" data-bind="value: myComplexObject().fieldZ" />
        <button id="myMethodTest" data-bind="click: myButton_Click" >click me</button>
    </body>
</html>

运行它

好的 - 是时候尝试了。完成,在.ts文件中设置一些断点,然后点击F5。


结论:

如您所见,示例中没有很多代码。如果运行该示例,并单击该按钮,您会发现index.html上的按钮绑定到myViewModel.ts中名为myButton_Click的方法。此外,文本框myStringTest2和myNumberTest绑定到视图模型中定义的变量。

require-config.ts文件包含已连接的依赖项列表。 “knockout.applyBindings(viewModel)”行将myViewModel的实例与html视图相关联。

注意TypeScript如何允许使用数据类型声明变量?

我希望这本入门书有所帮助。只是将几件放在桌子上帮助我想象出这些组件如何一起玩。 KnockoutJS有一些很酷的插件 - 比如knockout-mapping - 它允许从Web服务中提取的数据直接绑定到视图模型而不需要中间转换或转换。此外,knockoutjs可以支持模板化 - 大概可以实现母版页。

为了完整起见,我将添加一个名为Views的项目文件夹,并在那里保存我的html。我认为这对于MVC / MVVM开发来说更为传统。有.html的网址仍在唠叨我。我喜欢MVC风格的路由(没有文件扩展名),但这也很酷 - 特别是因为它只不过是HTML和JavaScript - 真正的跨平台。除了Web服务调用(未包含在示例中),没有回发,客户端处理速度很快。

请随时发表评论......