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

标签 javascript mvvm knockout.js requirejs typescript

我一直在寻找一个简单的方法,以使用RequireJS,jQuery和KnockoutJS创建Visual Studio 2012 TypeScript项目的最基本示例。有几个示例可供使用,但对我而言,有些示例比我想的要复杂,因此我着手创建方法,并将其发布在此处以供公众审查。作为问答式知识共享练习,我已经回答了自己的问题。

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

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

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

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

KnockoutJS-UI绑定(bind),利用MVVM模式。 HTML View 引用 View 模型中的变量和方法。 View 模型是一个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(好吧,因为这是本教程的范围)

最佳答案

免责声明

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

入门

安装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 Studio2012。
  • 选择菜单项"file"->“新建”->“项目...”
  • 导航到"template"->“其他语言”->“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本教程。它安装了一个 typescript def文件
    由Josh Baldwin-版本2.1.8)
  • knockout 。TypeScript.DefinitelyTyped(我选择的版本是0.5.7,
    本教程的Jason Jarrett)


  • 设置项目文件夹

    在项目的根目录下创建项目文件夹
  • 应用程序
  • 模型
  • ViewModels


  • 创建一个基本的TypeScript模型

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

  • 修改文件“myTestModel.ts”
    class myTestModel {
        public fieldZ: string;
        public fieldY: string;
        public fieldX: number;
    }
    export=myTestModel;
    

    创建一个TypeScript View 模型

    将TypeScript文件添加到项目文件夹“ViewModels”
  • 右键单击解决方案资源管理器中的文件夹“ViewModels”
  • 选择上下文菜单项“添加”->“新项...”
  • 在左侧 Pane 中,突出显示“Visual C#”
  • 在右侧 Pane 中,突出显示“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配置文件
  • 在解决方案资源管理器
  • 中右键单击项目文件夹“应用程序”
  • 选择上下文菜单项“添加”->“新项...”
  • 在左侧 Pane 中,突出显示“Visual C#”
  • 在右侧 Pane 中,突出显示“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

    需要将 View 与 View 模型对齐。
    <!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上的按钮绑定(bind)到myViewModel.ts中名为myButton_Click的方法。此外,文本框myStringTest2和myNumberTest绑定(bind)到 View 模型中定义的变量。

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

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

    希望本入门手册对您有所帮助。只需将几张桌子放在桌子上,就可以使我看到这些组件如何一起发挥作用。 KnockoutJS有一些很酷的插件(例如, knockout 映射),它允许从Web服务提取的数据直接绑定(bind)到 View 模型,而无需中间转换或转换。另外,knockoutjs可以支持模板-大概可以实现母版页。

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

    请随意发表评论...

    关于javascript - 如何使用jQuery,RequireJS和KnockoutJS创建基本的TypeScript项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25924288/

    相关文章:

    javascript - THREE.js OrbitControls 不工作

    javascript - React.createClass 组件中出现语法错误

    wpf - MVVM:所有 View 的一个 View 模型结构与每个 View 单独的 View 模型结构?

    c# - 将 View 模型中的 ObservableCollection 绑定(bind)到列表框

    javascript - 渲染后的选择器

    javascript - 隐藏/显示按钮和链接交替吗?昏死

    javascript - JS : Why . 值在一种情况下有效,但在另一种情况下无效?

    javascript - Vue.js 没有自动更新

    windows-phone-7 - 如何在WP7应用中检测后退按钮-vs- GoBack()

    javascript - 订阅循环中的属性 - KnockoutJs