有关AngularJS请求WebAPI资源的思路

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

页面部分大致如下:

<body ng-app="PRoductManagement">...<div ng-include="'app/products/productListView.html'"></div>...</body>

productManagement是页面module的名称。页面内容通过ng-include加载productListView.html这个页面。注意:ng-include属性值是字符串'app/products/productListView.html', 而不是app/products/productListView.html,这点很容易疏忽。

页面部分的javaScript引用顺序通常是:有关AngularJS的文件、页面级别的js文件、自定义有关Service的js文件、具体有关controller的js文件,就像这样:

<!-- Library Scripts -->

<script src="scripts/angular.js"></script>

<script src="Scripts/angular-resource.js"></script>

<!--applicationScript -->

<script src="app/app.js"></script>

<!-- Services -->

<script src="common/common.service.js"></script>

<script src="common/productResouce.js"></script>

<!-- Product Controllers -->

<script src="app/products/productListCtrl.js"></script>

在common.service.js中,定义了一个module:

(function() {"use strict";

angular.module("common.services", ["ngResource"])

.constant("appSettings", {

serverPath:"http://localhost:49705/"});

}());

以上,common.services这个module,依赖ngResource这个module,而ngResource这个module是被封装在angular-resource.js文件中的,由此,把有关AngularJS的文件放在顶部是有道理的,否则common.services这个module就引用不到了。另外,common.services这个module还定义了一个常量,key是appSettings, value是一个object对象,该对象的serverPath存储固定域名。

接下来,通过productResouce.js文件,自定义一个factory,用来返回具体的API路径。

(function() {"use strict";//通过工厂的方式创建了一个服务angular.module("common.services")

.factory("productResource", ["$resource", "appSettings", productResouce]);functionproductResouce($resource, appSettings) {return$resource(appSettings.serverPath + "/api/products/:id");

}

}());

以上,为common.services这个module增加了一个factory,返回经$resource封装的API路径。同样$resource这个服务来自于,angular-resource.js文件,再次体会到把有关AngularJS的文件放在顶部是有道理的。

好,有了module,注册了factory,productListCtrl.js就来使用它们。

(function() {"use strict";

angular

.module("productManagement")

.controller("ProductListCtrl",

ProductListCtrl);functionProductListCtrl(productResource) {varvm =this;

productResource.query(function(data) {

vm.products=data;

});

}

}());

以上,通过factory注册的service注入到这里,调用productResource.query方法把数据加载到model中来。

然后,productListView.html这个页面使用ProductListCtrl这个controller。

<divclass="panel panel-primary"ng-controller="ProductListCtrl as vm"><divclass="panel-heading"style="font-size:large">Product List</div><divclass="panel-body"><tableclass="table"><thead><tr><td>Product</td><td>Code</td><td>Available</td><td>Price</td></tr></thead><tbody><trng-repeat="product in vm.products"><td>{{ product.productName}}</td><td>{{ product.productCode }}</td><td>{{ product.releaseDate | date }}</td><td>{{ product.price | currency }}</td></tr></tbody></table></div></div>

在页面级别的app.js文件中是这样的:

(function() {"use strict";varapp = angular.module("productManagement", ["common.services"]);

}());

以上,productManagement依赖于自定义的common.services这个moduel。

总结:

1、js的位置关系要养成好的习惯:AngularJS文件,页面文件,自定义service文件,controller文件

2、把请求API的逻辑封装到自定义modlue中去,通过factory方式自定义service,使用$resouce来封装API请求路径

3、把自定义的service注入到controller中,请求API数据给Model

4、在主页面的module注册所有依赖的module

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航