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

Javascript 如何使用jQuery、RequireJS和KnockoutJS创建基本的TypeScript项目,javascript,mvvm,knockout.js,requirejs,typescript,Javascript,Mvvm,Knockout.js,Requirejs,Typescript,我一直在寻找一个简单的操作方法,用RequireJS、jQuery和KnockoutJS创建Visual Studio 2012 TypeScript项目的最基本示例。有几个例子,但对我来说,有些比我想要的更复杂,所以我开始创建一个操作指南,并将其发布在这里供公众审查。作为问答式的知识共享练习,我回答了自己的问题 对于那些不熟悉的人,这里是所包含组件的快速分解 -Visual Studio扩展,允许脚本通过JavaScript超集语言创建.TS文件。这提供了定义与方法和变量相关联的数据类型的能力

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

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

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

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

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

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

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

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

/// <reference path="../Scripts/typings/requirejs/require.d.ts" />
这就是TypeScript编译器将如何包含requirejs DefiniteType定义文件。创建这些明确类型脚本的组织已经创建了一个庞大的集合。这里我们只提到两个KnockoutJS和RequireJS,因为这是本教程的范围

免责声明 本指南将展示一种使用TypeScript、jQuery、KnockoutJS和RequireJS构建基本网站的方法。还有很多其他方法可以做到这一点

开始 安装Visual Studio扩展

为Microsoft Visual Studio 2012 PowerTool 1.0.1.0安装Visual Studio 2012扩展-类型脚本

创建新的VisualStudio项目

启动visual studio 2012。 选择菜单项文件->新建->项目。。。 导航到模板->其他语言->键入此脚本 实际上创建了一个扩展名为.csproj的项目文件 使用TypeScript选择项目类型HTML应用程序 清理 从项目中删除文件app.css、app.ts

添加组件 使用NuGet,添加

RequireJS I为本教程选择了2.1.15版 KnockoutJS我为本教程选择了3.2.0版 jQuery I为本教程选择了2.1.1版 requirejs.TypeScript.DefinitelyTyped我选择了0.2.0版 Jason Jarrett将学习本教程。它安装了一个typescriptdef文件 由Josh Baldwin编写-版本2.1.8 knockout.TypeScript.DefinitelyTyped我选择了0.5.7版 Jason Jarrett将学习本教程 设置项目文件夹 在项目的根目录下创建项目文件夹

应用 模型 视图模型 创建一个基本的TypeScript模型 将TypeScript文件添加到项目文件夹模型

在解决方案资源管理器中的文件夹模型上单击鼠标右键 选择上下文菜单项添加->新建项。。。 在左侧窗格中,高亮显示Visual C 在右侧窗格中,高亮显示TypeScript文件 在“文件名”文本框中,输入myTestModel.ts,然后单击“添加”按钮 修改文件myTestModel.ts

class myTestModel {
    public fieldZ: string;
    public fieldY: string;
    public fieldX: number;
}
export=myTestModel;
创建TypeScript视图模型 将TypeScript文件添加到项目文件夹ViewModels

在解决方案资源管理器中的文件夹ViewModels上单击鼠标右键 选择上下文菜单项添加->新建项。。。 在左侧窗格中,高亮显示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配置文件

在解决方案资源管理器中的项目文件夹应用程序上单击鼠标右键 选择上下文菜单项添加->新建项。。。 在左侧窗格中,高亮显示Visual C 在右侧窗格中,高亮显示TypeScript文件 在“文件名”文本框中,输入requi re-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>
运行它 好的,是时候试一试了。Comple,在.ts文件中设置一些断点,然后按F5

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

<!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>
require-config.ts文件保存连接的依赖项列表。行knockout.applyBindingsviewModel将myViewModel的实例与html视图相关联

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

我希望这本入门书能有所帮助。仅仅把几块放在桌子上就可以让我想象这些组件是如何相互作用的。KnockoutJS有一些很酷的插件,比如knockout映射,它允许从web服务中提取的数据直接绑定到视图模型,而无需中间转换或转换。另外,knockoutjs可以支持模板化——大概是为了实现母版页

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


请随时发表评论…

非常感谢。我花了一周时间在网上搜索同一个问题。这是第一个实际有效的建议。我已经能够使用require.js加载jquery和主干。最重要的是,我的断点是在VisualStudio中命中的@barrypicker,谢谢你的全面报道,你能不能加入淘汰绑定处理程序?它们似乎对KO至关重要,但我找不到任何关于将它们用于TS的文档。我的相关问题: