我一直在寻找一个简单的操作方法,使用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(好吧,因为这是本教程的范围)
答案 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项目
从项目中删除文件app.css,app.ts
使用NuGet,添加...
在项目根目录下创建项目文件夹
将TypeScript文件添加到项目文件夹“Models”
修改文件“myTestModel.ts”
class myTestModel {
public fieldZ: string;
public fieldY: string;
public fieldX: number;
}
export=myTestModel;
将TypeScript文件添加到项目文件夹“ViewModels”
修改文件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配置文件
修改文件“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);
});
});
});
需要将视图与视图模型对齐。
<!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服务调用(未包含在示例中),没有回发,客户端处理速度很快。
请随时发表评论......