angularjs service全局保存数据的误区
2016-10-20 10:44
246 查看
《angular权威指南》中有这么一句话“服务提供了一种能在应用的整个生命周期内保持数据的方法,它能够在控制器之间进行通信,并且能保证数据的一致性。”
这里的【应用的整个生命周期】中的【应用】到底是什么?估计原文是【app】,然后就被翻译成了【应用】。【应用】是有歧义的,他可以有两个含义:1、指整个web应用,这样的话,他就类似于session了。第二个含义:【应用】指某个module,在这个module下面的为同一个实例。
那么,到底是不是第一个含义呢?我们来试一下。
上一篇文章中我将service理解为了可以提供类似session的东西,我们看一下代码:
这里的Base.bindArguments保证了回调中的this为该服务
然后,我们在另一个module中看看能不能取到token和auth
结果是这里的loginname和token是空的。说明这里依赖注入的userService和之前的userService已经不是同一个对象了。也就是这两个userService变量中的指针指向不同的堆内存
这里的【应用的整个生命周期】中的【应用】到底是什么?估计原文是【app】,然后就被翻译成了【应用】。【应用】是有歧义的,他可以有两个含义:1、指整个web应用,这样的话,他就类似于session了。第二个含义:【应用】指某个module,在这个module下面的为同一个实例。
那么,到底是不是第一个含义呢?我们来试一下。
上一篇文章中我将service理解为了可以提供类似session的东西,我们看一下代码:
(function(angular){ angular.module('app.login') .factory('userService',function($http){ return { http:$http, token:'', auth:[], loginname:'', login:function(loginname,password,fn){ this.http({ url:'../../scripts/loginModule/services/loginOKTest.js', method:'GET' }) //data,header,config,status .success(Base.bindArguments(this,function(){ var data=arguments[0][0]; if(data[0].success){ this.token=data[0].token; this.auth=data[0].auth; Cookies.setCookieValue("loginname",this.loginname,60*60*1000); Cookies.setCookieValue("token",this.token,60*60*1000); fn(data[0]); } })) .error(function(data,header,config,status){ alert("验证服务请求失败!"); }); }, getToken:function(){ return this.token; }, getLoginname:function(){ return this.loginname; }, getAuth:function(){ return this.auth; }, loginout:function(){ this.token=''; this.loginname=''; this.auth=[]; Cookies.delCookieValue("token"); Cookies.delCookieValue("loginname"); } }; }); })(window.angular);我们在这里设置了token和auth成员变量
这里的Base.bindArguments保证了回调中的this为该服务
Base.bindArguments=function(context,fn){ return function(){ return fn.call(context,arguments); }; };
然后,我们在另一个module中看看能不能取到token和auth
(function(angular){ if(!app) app={}; if(!app.main) app.main=angular.module('app.main', []); app.main.controller('MenuController',function($scope,menuService,userService){ var loginname=Cookies.getCookieValue("loginname"); var token=Cookies.getCookieValue("token"); Cookies.delCookieValue("token"); Cookies.delCookieValue("loginname"); $scope.menu=[]; menuService.initMenu(loginname,token,function(menu){ $scope.menu=menu; $scope.$broadcast("menuLoaded"); }); $scope.displaySwitch=function(index){ if($scope.menu[index].isShow) $scope.menu[index].isShow=false; else $scope.menu[index].isShow=true; }; }); })(window.angular);
结果是这里的loginname和token是空的。说明这里依赖注入的userService和之前的userService已经不是同一个对象了。也就是这两个userService变量中的指针指向不同的堆内存
相关文章推荐
- angularjs service全局保存数据的误区
- AngularJS ui-router 用resolve、service预先加载数据写法,属于优化性能方面吧
- AngularJS ui-router 用resolve、service预先加载数据的正确写法
- [转载]Understanding Service Types for Angularjs
- Android编程心得-使用Application类保存应用的全局数据
- JS基础,将ztree前台数据保存到数据库
- Windows开发应用(2)通过静态属性Properties来保存全局数据
- JS定时保存表单数据
- Angularjs accessing methods in another factory/service
- js读取本地磁盘文本文件并保存为JSON数据(有格式的文本)
- 不刷新页面jQuery模糊搜索,第二种实现---js全局变量存储数据
- js操作userData保存临时数据
- jS+Webservice取数据
- 七步从Angular.JS菜鸟到专家(3):数据绑定和AJAX
- Active 与 Service 的生命周期、保存数据----Day04 2014.5.29
- js--easyUI----jQuery easyui datagrid 点击某个单元格即进入编辑状态,焦点移开后,保存数据
- js下利用userData实现客户端保存表单数据
- js下利用userData实现客户端保存表单数据
- 使用js弹出模态窗口,提交保存数据后关闭模态窗口,刷新父窗口
- Knockout.Js官网学习(加载或保存JSON数据)