使用 AngularJS 开发一个大规模的单页应用(SPA)(2)

AngularJS使用入门 - 外壳页面,模块和路由

你首先要做的一件事情就是讲AngularJS框架下载到你的项目中,你可以从 https://angularjs.org 获得框架. 本文的示例程序是使用MS Visual Studio Web Express 2013 Edition开发的,因此我是使用如下的命令从一个Nuget包安装AngularJS的:

Install-Package AngularJS -Version 1.2.21

Nuget包管理控制台上. 为了保持简单和灵活性,我创建了一个空的 Visual Studio web 应用程序项目,并将Microsoft Web API 2库选进了核心引用. 这个应用程序将使用Web API 2 库来实现 RESTful API 的服务器端请求.

现在当你要使用AngularJS创建一个SPA应用程序是,首先要做的两件事情就是设置一个外壳页面,以及用于获取内容页面的路由表. 开始的时候,外壳页面只需要一个队AngularJS JavaScript库的引用,还有一个ng-view,来告诉AngularJS内容页面需要在外壳页面的那个地方被渲染.

<!DOCTYPE html>
<html lang="en">
<head>
<title>AngularJS Shell Page example</title>
</head>
<body>
<div>
<ul>
<li><a href="#Customers/AddNewCustomer">Add New Customer</a></li>
<li><a href="#Customers/CustomerInquiry">Show Customers</a></li>
</ul>
</div>
<!-- ng-view directive to tell AngularJS where to inject content pages -->
<div ng-view></div>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js"></script>
<script src="https://www.linuxidc.com/Linux/2014-09/app.js"></script>
</body>
</html>

在上面的外壳页面示例中,几个链接呗映射到了AngularJS的路由。div标签上的ng-view指令是一个能将选定路由的被渲染内容页面包含到外壳页面来补充AngularJS的$route服务的指令. 每次当目前的路由变化时,包含的视图也会根据$route服务的配置随之改变. 比如,当用户选择了 "Add New Customer" 链接,AngularJS 就会在ng-view所在的div里面渲染用于添加一个新顾客的内容 . 被渲染的内容是一个HTML片段.

接下来的app.js文件同样也被外壳页面引用了。这个文件里的JavaScript将会为应用程序创建AngularJS模块。此外,应用程序所有的路由配置也会在这个文件中定义。你可以把一个AngularJS模块想象成封装你应用程序不同部分的容器。大多数的应用程序都会有一个主方法,用来初始化应用程序的不同部分,并将它们联系起来。AngularJS应用程序却没有一个主方法,而是让模块声明性的指定应用程序如何启动和配置. 本文的示例程序将只会有一个AngularJS模块,虽然应用程序中存在几个明显不同的部分(顾客,产品,订单和用户).

现在,app.js的主要目的就是如下所示,用来设置AngularJS的路由。AngularJS的$routeProvider服务会接受  when() 方法,它将为一个Uri匹配一个模式. 当发现一次匹配时,独立页面的HTML内容会跟随相关内容的控制器文件一同被加载到外壳页面中. 控制器文件就简单的只是一个JavaScript文件,它将获得带有某个特定路由请求内容的引用.

//Define an angular module for our app
var sampleApp = angular.module(&apos;sampleApp&apos;, []);
//Define Routing for the application
sampleApp.config([&apos;$routeProvider&apos;,
    function($routeProvider) {
        $routeProvider.
            when(&apos;/Customers/AddNewCustomer&apos;, {
                templateUrl: &apos;Customers/AddNewCustomer.html&apos;,
                controller: &apos;AddNewCustomerController&apos;
            }).
            when(&apos;/Customers/CustomerInquiry&apos;, {
                templateUrl: &apos;Customers/CustomerInquiry.html&apos;,
                controller: &apos;CustomerInquiryController&apos;
            }).
            otherwise({
                redirectTo: &apos;/Customers/AddNewCustomer&apos;
            });
}]);

AngularJS 的控制器

AngularJS 控制器无非就是一个原生的JavaScript函数,只是被绑定到了一个特定的范围而已。控制器用来将逻辑添加到你的视图。视图就是HTML页面。这些页面只是做简单的数据展示工作,我们会使用双向数据绑定来将数据绑定到这些HTML页面上. 将模型(也就是数据)同数据粘合起来基本山就是控制器的职责了.

<div ng-controller="customerController">
<input ng-model="FirstName" type="text" />
<input ng-model="LastName" type="text" />     
<div>
<button ng-click="createCustomer()"/>Create</button>

对于上面的AddCustomer模板,ng-controller指令将会引用JavaScript函数customerController,这个控制会执行所有的数据绑定以及针对该视图的JavaScript函数.

function customerController($scope)
{
    $scope.FirstName = "William";
    $scope.LastName = "Gates";
 
    $scope.createCustomer = function () {         
        var customer = $scope.createCustomerObject();
        customerService.createCustomer(customer,
                        $scope.createCustomerCompleted,
                        $scope.createCustomerError);
    }
}

开箱即用 - 可扩展性问题

当我为本文开发这个实力程序时,首当其冲的两个扩展性问题在应用单页面应用程序时变得明显起来。其实一个开箱即用,AngularJS需要应用程序的外壳页面中所有的JavaScript文件和控制器在启动中伴随应用程序的启动被引入和下载. 对于一个大型的应用程序而言,可能会有上百个JavaScript文件,这样情况看上去就会不怎么理想。我遇到的另外一个问题就是AngularJS的路由表。我找到的所有示例都有针对所有内容的所有路由的硬编码。而我想要的确不是一个在路由表里包含上百项路由记录的方案.

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/41d2bc23261fec21a26cca1c517ed6fc.html