当前位置: 首页 > news >正文

有关AngularJS请求Web API资源的思路

 

页面部分大致如下:

 

<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>
<!-- Application Script -->
<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]);

    function productResouce($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);

    function ProductListCtrl(productResource) {
        var vm = this;

        productResource.query(function (data) {
            vm.products = data;
        });
    }
}());

 

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

 

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

 

<div class="panel panel-primary"
     ng-controller="ProductListCtrl as vm">
    <div class="panel-heading"
         style="font-size:large">
        Product List
    </div>

    <div class="panel-body">
        <table class="table">

            <thead>
                <tr>
                    <td>Product</td>
                    <td>Code</td>
                    <td>Available</td>
                    <td>Price</td>
                </tr>
            </thead>
            <tbody>
                <tr ng-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";

    var app = 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

 

相关文章:

  • C# 调用 C++ Dll 类库的传参问题
  • 转:fastText原理及实践(达观数据王江)
  • 算法问题实战策略
  • BZOJ 2584: [Wc2012]memory(扫描线+线段树)
  • 用最新NLP库Flair做文本分类
  • ASP.NET Core 2.0 : 三. 项目结构
  • 前后端分离架构中接口测试最佳实践
  • js闭包与高阶函数
  • java知识点1(this指针)
  • Confluent 修改开源许可证,限制云供应商滥用
  • vagrant设置虚拟机的名字
  • 寒假作业安排及注意点
  • 团队管理 - 团队发展五阶段
  • 线性代数---范数
  • Delphi 调用C#编写的WebService 参数为Null解决方法
  • [译]前端离线指南(上)
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • JavaScript函数式编程(一)
  • leetcode388. Longest Absolute File Path
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • 动态魔术使用DBMS_SQL
  • 翻译:Hystrix - How To Use
  • 前端面试之闭包
  • 数据结构java版之冒泡排序及优化
  • 数据科学 第 3 章 11 字符串处理
  • Hibernate主键生成策略及选择
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (Java数据结构)ArrayList
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (学习日记)2024.02.29:UCOSIII第二节
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .net6+aspose.words导出word并转pdf
  • .NET开源项目介绍及资源推荐:数据持久层
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • @JSONField或@JsonProperty注解使用
  • [ 2222 ]http://e.eqxiu.com/s/wJMf15Ku
  • [ vulhub漏洞复现篇 ] ECShop 2.x / 3.x SQL注入/远程执行代码漏洞 xianzhi-2017-02-82239600
  • [ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹
  • [2544]最短路 (两种算法)(HDU)
  • [BUUCTF NewStarCTF 2023 公开赛道] week4 crypto/pwn
  • [Everyday Mathematics]20150130
  • [html] 动态炫彩渐变背景
  • [LeetCode 127] - 单词梯(Word Ladder)
  • [office] 图文演示excel怎样给单元格添加下拉列表 #知识分享#经验分享
  • [Prism]Composite Application Guidance for WPF(9)——命令
  • [python] 过年燃放烟花
  • [Python] 输入与输出
  • [Ray Tracing in One Weekend] 笔记
  • [Rust学习:二]变量和传参
  • [Spring] IOC控制反转/DI依赖注入详细讲解