在学习笔记-AngularJs(六)提及了事件处理器和过滤器以及它们的例子,而我们知道之前我是使用$http服务去获得我们需要的json数据,但是$http是比较底层的用法,有时候我们想把获取json数据包装成一个服务,然后每个控制器只要直接依赖我们自己写的服务,就可以去获取需要的数据,那么就需要自定义服务,现在我们需要学习一下怎么定义自己的服务,于是我们在js中建了services.js,一不小心插入个链接,http://t.cn/RUbL4rP,忽略,代码如下:

 var phoneService = angular.module('phoneService', ['ngResource']);

phoneService.factory("People",function($resource){   //工程函数,自定义的服务尽量不要使用$,避免跟自带服务混淆
return $resource('json/:phoneId.json', {}, {
query: {method:'GET', params:{phoneId:'phone'}, isArray:true}
});
})
//工厂创建一个资源对象,让你与RESTful服务器端数据源交互。

这里建立模块phoneService,至于为啥要怎么建,之前有讲过了,这里需要注意的是,依赖了ngResource模块,而且必须在index.html引入angular-resource.js文件,那么就可以使用$resource服务了。建立服务,可以使用factory、service,这里使用的是factory。在这里就不得不讲一下这个$resource服务了,使用方法:

$resource(url, [paramDefaults], [actions], options);

url,指得是RESTful服务器端的地址,有这样的一些形式:

$resource('http://example.com/resource.json') //这里指向的是resource.json

$resource('http://example.com/:id.json')  //通过传一个id参数过来,去获取对应的json
$resource('http://example.com/resource/:resource_id.:format')//通过传一个resource_id和format参数过来,去获取对应的格式的数据模型

paramDefaults,指得是默认参数,是一个对象,比如说:{resource_id:'1', salutation:'Hello'},那么其实整个默认url就是'http://example.com/resource/resource_id/1?salutation=hello',当参数{someParam: '@someProp'}是以@为前缀,那么这个参数的值将从相应的属性中提取data对象(调用一个操作方法时提供)。例如,如果defaultParam对象是{ someParam:@someProp }然后someParam将data.someProp的value。对于这个带@前缀的值,不大清楚是怎么回事,望知道的人告知一下!

action,可以自定义获取资源的行为,其语法如下:

{action1: {method:?, params:?, isArray:?, headers:?, ...},
action2: {method:?, params:?, isArray:?, headers:?, ...},
...}

其对应的参数,还有url(资源路径的重写)、timeout(请求超时)、responseType(请求数据类型)、function(data){...}的Response函数,等等(更多属性可去官方文档看)!

比如说我们重新自定义query请求资源的行为:query: {method:'GET', params:{phoneId:'phone'}, isArray:true},那么调用该方法,就能获得phone.josn的数据。

也有这些默认的行为(其属性是与自定义资源行为的action是一样的):

{ 'get':    {method:'GET'},
'save': {method:'POST'},
'query': {method:'GET', isArray:true},
'remove': {method:'DELETE'},
'delete': {method:'DELETE'} };

假如现在有怎么一个需求,需要我们在控制器文件中检索出phone.json中userId=123的一条数据,可以这样写:

//services.js(自定义服务文件)
phoneService.factory("People",function($resource){
return $resource('/user/:userId', {userId:'@id'});
})
//controller.js(控制器文件)
var user = People.get({userId:123}, function() {
user.abc = true;
user.$save();
});

这里是这样的,获得userId=123的某个对象,然后在其回调函数将其user.abc进行修改,然后使用$save保存,然后再返回新的记录,赋给user,user是我们得到的资源对象实例,那么操作保存,删除,删除可用方法$+对应资源行为(eg:$save())方法。这样就可以轻松地支持CRUD操作(创建、读取、更新、删除)在服务器端数据!想更好理解这种形式的curd,可以看一下这个官方的例子:

// Define CreditCard class
var CreditCard = $resource('/user/:userId/card/:cardId',
{userId:, cardId:'@id'}, {
charge: {method:'POST', params:{charge:true}}
}); // We can retrieve a collection from the server
var cards = CreditCard.query(function() {
// GET: /user/123/card
// server returns: [ {id:456, number:'1234', name:'Smith'} ]; var card = cards[];
// each item is an instance of CreditCard
expect(card instanceof CreditCard).toEqual(true);
card.name = "J. Smith";
// non GET methods are mapped onto the instances
card.$save();
// POST: /user/123/card/456 {id:456, number:'1234', name:'J. Smith'}
// server returns: {id:456, number:'1234', name: 'J. Smith'}; // our custom method is mapped as well.
card.$charge({amount:9.99});
// POST: /user/123/card/456?amount=9.99&charge=true {id:456, number:'1234', name:'J. Smith'}
}); // we can create an instance as well
var newCard = new CreditCard({number:''});
newCard.name = "Mike Smith";
newCard.$save();
// POST: /user/123/card {number:'0123', name:'Mike Smith'}
// server returns: {id:789, number:'0123', name: 'Mike Smith'};
expect(newCard.id).toEqual();

好了,来看一下controller.js文件:

var phoneController = angular.module('phoneController',  []); 

phoneController.controller("phone-list-controller",['$scope','People',function($scope,People){
$scope.phones = People.query(); //重写的资源行为
$scope.order = 'name';
}]); phoneController.controller("phone-detail-controller",["$scope",'$routeParams',"People","$location",function($scope,$routeParams,People,$location){
if($routeParams.phoneId){
  //使用默认资源行为
$scope.people = People.get({phoneId: $routeParams.phoneId}, function(data) {
$scope.main_image = data.images[0];
}); }else{
$location.path("/phones");
}
$scope.setImage=function(url){ $scope.main_image = url;
} /*$location使用*/
console.log($location.absUrl()); //"http://example.com/#/some/path?foo=bar&baz=xoxo" => 完整url
console.log($location.url()); // "/some/path?foo=bar&baz=xoxo" => url的search部分
console.log($location.protocol()); // "http" =>协议
console.log($location.host()); // "example.com" => 主机
console.log($location.port()); // "80" =>端口号
//console.log($location.path([path])); // "/some/path" => 跳转至指定路由
console.log($location.search()); //{foo: 'bar', baz: 'xoxo'} => 以对象形式展现,还可以$location.search("foo","yahoo");进行修改
console.log($location.hash()); // given url http://example.com/#/some/path?foo=bar&baz=xoxo#hashValue $location.hash() == "hashValue"
  //更详细的介绍可以去看官方文档
}]);

上面有着$loaciton服务的一些补充!那么学习的项目就这样搞定了,但是就只是入门而已,接下来需要好好阅读angularJs的官方文档,真正想搞懂,还是得去看文档!虽然是英文渣渣,但是确实必经之路!加油!源码下载:https://github.com/xiaobin5201314/AngularJS-Learning.git

学习笔记-AngularJs(七)的更多相关文章

  1. opencv学习笔记(七)SVM+HOG

    opencv学习笔记(七)SVM+HOG 一.简介 方向梯度直方图(Histogram of Oriented Gradient,HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子 ...

  2. VSTO学习笔记(七)基于WPF的Excel分析、转换小程序

    原文:VSTO学习笔记(七)基于WPF的Excel分析.转换小程序 近期因为工作的需要,要批量处理Excel文件,于是写了一个小程序,来提升工作效率. 小程序的功能是对Excel进行一些分析.验证,然 ...

  3. Python学习笔记(七)

    Python学习笔记(七): 深浅拷贝 Set-集合 函数 1. 深浅拷贝 1. 浅拷贝-多层嵌套只拷贝第一层 a = [[1,2],3,4] b = a.copy() print(b) # 结果:[ ...

  4. 学习笔记-AngularJs(十)

    前面一直在说自定义指令,但是却一直没有一次系统地去了解,现在需要我们一起来学习如何去使用自定义指令,去丰富html标签.属性,实现多元化.多功能的标签(或是属性).辣么,啥是指令?要了解指令,首先需要 ...

  5. 学习笔记-AngularJs(九)

    到目前为止,我们所做的学习案例都是没有加任何动画效果的,对于以往来说,我们经常会去使用一些动画插件或是css框架(如:animate.css)来点缀我们的网页,这样显得生动,高大上,那么接下来我们可以 ...

  6. 学习笔记-AngularJs(六)

    在学习笔记-AngularJs(五),通过引入bootstrap.css进行改写整个样式,这时学习项目也变得好看多了,现在我们又需要目录再进行一次改变,如下图: 这样就符合之前讲的对学习目录进行布置了 ...

  7. 学习笔记-AngularJs(三)

    学习笔记-AngularJs(二)写了个所有程序语言入门时都必须要写的Hello World,那么从现在开始做那个之前说过的互联网大佬介绍的学习例子,当然这里开始会慢慢按照之前说过的目录来搭建这个学习 ...

  8. 学习笔记-AngularJs(二)

    在接下来学习angularjs中,我按照的就是之前 学习笔记-AngularJs(一)所讲的目录来搭建一个学习的项目,做一个互联网大佬人物简介的例子,当然也可以使用angualrjs上面提供的官方例子 ...

  9. .NET MVC 学习笔记(七)— 控制input控件

    .NET MVC 学习笔记(七)— 控制input控件 画面中有时候需要输入数字,这时就需要控制input的输入.以下为保留两位有效数字. /* * 初始化数字输入 */ function initD ...

随机推荐

  1. 日期时间函数 mysql 和sqlserver 中对于常用函数的日期和时间函数的区别

    1. sqlserver中获取时间用getdate(),默认返回格式是2019-01-21 13:58:33.053,具体的年月日,时分秒毫米,年月日之间用短线连接,时分秒之间用冒号连接,秒和毫米之间 ...

  2. Linux简单入门

    1.目录切换命令 cd usr 切换到该目录下usr目录 cd ../ 切换到上一层目录 cd / 切换到系统根目录 cd ~ 切换到用户主目录 cd - 切换到上一个所在目录 2.目录的操作命令 1 ...

  3. 关于UTC时间和本地时间

    收藏了个类Publics  可以实现本地时间和UTC时间的转换 UCT时间=本地时间-8    本地时间比UTC时间快8小时 element-ui的日期选择器上  选择的时间显示的是本地时间   但实 ...

  4. 如何看待Arcsoft虹软,推出的人脸认知引擎免费SDK?

    虹软公司是一家具有硅谷背景的图像处理公司,除了人脸技术以外,还有多项图像及视频处理技术.他们的双摄像头处理算法和人脸美化算法囊括了包括OPPO VIVO,SUMAMNG一系列手机厂商. 整个人脸识别运 ...

  5. Linux 中 MySQL常用命令

    一. 数据库登录mysql -uroot -p二..退出数据库quit 和 exit或ctrl + d三.数据库操作1. 查看所有数据库 show databases;2. 查看当前使用的数据库sel ...

  6. Linux性能测试工具-UnixBench

    ■下载路径: unixbench-5.1.2.tar.gz :http://soft.vpser.net/test/unixbench/ unixbench-5.1.3.tar.gz :http:// ...

  7. python中的异常处理tryexcept

    1.异常基础 在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户,而是现实一个提示的页面,通俗来说就是不让用户看见大黄页!!! 2.异常种类 names = ['张三','李四 ...

  8. 验证码之SimpleCaptcha (一)

    在captcha中,两个比较著名的框架验证码有Jcaptcha和simpleCaptcha,Jcaptcha太庞大了,所以我选择了简单的SimpleCaptcha       simpleCaptch ...

  9. 提取出一个组装基因组的gap(N)和重复序列区域,保存为bed格式

    参见: Question: How to extract allnon-seqencedpositions from a genome (Fasta file)? test.fa >chr1 N ...

  10. javaweb课程信息管理系统

    1.DBUtil包连接数据库 2.Bin包设计成员函数及方法 3.Dao包设计sql语句 4.servlet包增删改查方法 5.service连接servlet 6.设计jsp增删改查页面 7.连接各 ...