AngularJS进阶(三十四)Angular数据更新不及时问题探讨
Angular数据更新不及时问题探讨
前言
在修复控制角标正确变化过程中,发觉前端代码组织层次出现了严重问题。传递和共享数据时自己使用的是rootScope,为此造成了全局变量空间的污染。根据《AngularJs深度剖析与最佳实践》,如果两个控制器的协作存在大量的数据共享和交互可以利用Factory等服务的“单例”特性为它们注入一个共享对象来传递数据。而自己在使用rootScope时,出现了变量不一致的情况。如下图所示:
按照应用逻辑,“我的”角标变化应与“找药帮查询”角标变化一致。通过运行表明,“找药帮查询”角标存在变化异常的状况。通过阅读代码与调试,发现自己的业务逻辑存在问题。业务代码如下:
/*
* 更新我的徽标
*/
$rootScope.updateMyBadge = function() {
if (localStorage.logined != '1') {
$rootScope.mybadge = '';
}else{
if ($rootScope.medNoticeBadge_Sunny && $rootScope.medNoticeBadge_Sunny != 0 ) {
$rootScope.mybadge = $rootScope.medNoticeBadge_Sunny;
} else {
$rootScope.mybadge = '';
}
}
}
setTimeout(function(){
$rootScope.updateMyBadge();
},2*1000); // 2秒后执行
其中$rootScope.mybadge为相应角标变量。其值来自于全局变量$rootScope.medNoticeBadge_Sunny,而这个变量又来自于下面的方法体:
/*
* 已响应查询找药小红点
*/
$rootScope.updateMedNoticeBadge = function(num) {
console.log(num);
$rootScope.medNoticeBadge = 0;
if (localStorage.getItem('medNoticeBadge')) {
$rootScope.medNoticeBadge = Number(localStorage.getItem('medNoticeBadge'));
$rootScope.medNoticeBadge += num;
} else {
$rootScope.medNoticeBadge += num;
}
localStorage.setItem('medNoticeBadge', $rootScope.medNoticeBadge);
$rootScope.medNoticeBadge_Sunny = localStorage.getItem('medNoticeBadge');
$rootScope.medNoticeBadge = localStorage.getItem('medNoticeBadge');
if (!$rootScope.userinfo.logined) {
localStorage.removeItem('medNoticeBadge');
$rootScope.medNoticeBadge = 0;
}
}
以上方法体又是通过如下语句调用的:
/*
*初次查询找药状况查询信息(只调用一次)
*/
$rootScope.getmedNoticeBadge = function() {
if (localStorage.logined == '1') {
var data = {
'stat': "1"
};
appCallServer($http, "9015", data, function(data) {
localStorage.setItem('medNoticeBadge', 0);
$rootScope.updateMedNoticeBadge(data.cnt);
}, function(data) {
console.log("9015_找药状况:" + data.errtext);
});
}
};
$rootScope.getmedNoticeBadge();
执行时出现了变量更新不及时的错误现象。导致角标显示异常。
通过阅读以上代码,发现变量均是通过rootScope传递的。为此自己通过延时执行角标变化的方法体。但这并不是一个良好的的项目组织层次。自己应该将控制角标变化的方法体封装成服务的形式,利用其单例特性解决数据不一致的情况。
自己尝试利用Factory单例特性创建服务,但是结果错误。代码如下:
myCtrl.factory('mybadgeService',function($http){
var mybadgeFactory = {};
mybadgeFactory.runMybadgeRequest = function(){
if (localStorage.logined == '1') {
var data = {
'stat': "1"
};
appCallServer($http, "9015", data, function(data) {
console.log("9015_找药状况-查询成功:" + JSON.stringify(data));
return data.cnt;
}, function(data) {
console.log("9015_找药状况:" + data.errtext);
return 0;
});
}
}
return mybadgeFactory;
});
参考文献:
1.http://www.xker.com/page/e2015/06/199141.html
美文美图
AngularJS进阶(三十四)Angular数据更新不及时问题探讨的更多相关文章
- Java进阶(三十四)Integer与int的种种比较你知道多少?
Java进阶(三十四)Integer与int的种种比较你知道多少? 前言 如果面试官问Integer与int的区别:估计大多数人只会说到两点:Ingeter是int的包装类,注意是一个类:int的初值 ...
- AngularJS进阶(三十九)基于项目实战解析ng启动加载过程
基于项目实战解析ng启动加载过程 前言 在AngularJS项目开发过程中,自己将遇到的问题进行了整理.回过头来总结一下angular的启动过程. 下面以实际项目为例进行简要讲解. 1.载入ng库 2 ...
- AngularJS进阶(三十八)上拉加载问题解决方法
AngularJS上拉加载问题解决方法 项目中始终存在一个问题:当在搜索栏输入关键词后(见图1),按照既定的业务逻辑应该是服务端接收到请求后,首先返回查询的前7条数据,待客户端出现上拉加载时,继续查找 ...
- 网站开发进阶(三十四)编码中的setCharacterEncoding 理解
编码中的setCharacterEncoding 理解 1.pageEncoding="UTF-8"的作用是设置JSP编译成Servlet时使用的编码. 2.contentType ...
- AngularJS进阶(三十六)AngularJS项目开发技巧之利用Service&Promise&Resolve解决图片预加载问题(后记)
AngularJS项目开发技巧之利用Service&Promise&Resolve解决图片预加载问题(后记) 前言 在"AngularJS项目开发技巧之图片预加载" ...
- AngularJS进阶(三十五)浏览器兼容性解决之道
浏览器兼容性解决之道 前言 浏览器兼容性一直是前端开发中不得不面对的一个问题.而最突出的就是IE.对绝大多数公司来说,兼容IE6的性价比已经很低,而IE7则几乎已经绝迹.所以,常见的兼容性下限是IE8 ...
- AngularJS进阶(三十二)书海拾贝之特殊的ng-src和ng-href
书海拾贝之特殊的ng-src和ng-href 在说明这两个指令的特殊之前,需要先了解一下ng的启动及执行过程,如下: 1) 浏览器加载静态HTML文件并解析为DOM: 2) 浏览器加载angular. ...
- AngularJS进阶(三十)AngularJS项目开发技巧之图片预加载
AngularJS项目开发技巧之图片预加载 绪 项目(移动端采用Ionic 框架)开发完毕,测试阶段发现移动APP首页的广告图片(图片由服务器端返回相应url地址)很难加载,主要原因还是网速.如下图左 ...
- AngularJS进阶(二十四)AngularJS与单选框及多选框的双向动态绑定
AngularJS与单选框及多选框的双向动态绑定 赠人玫瑰,手留余香.若您感觉此篇博文对您有用,请花费2秒时间点个赞,您的鼓励是我不断前进的动力,共勉! AngularJS 在 <in ...
随机推荐
- Java并发编程(一)-为什么要并发
并发所带来的好处 1. 并发在某些情况(并不是所有情况)下可以带来性能上的提升 1) 提升对CPU的使用效率 提升多核CPU的利用率:一般来说一台主机上的会有多个CPU核心,我们可以创建多个线程,理论 ...
- ACM Doing Homework again
Ignatius刚刚从第30届ACM / ICPC回到学校.现在他有很多作业要做.每个老师给他一个截止作业的截止日期.如果Ignatius在截止日期之后进行了家庭作业,老师将减少他的最终考试成绩.现在 ...
- vmware 12中安装MAC OS X Lion 10.7
下载并安装vmware. 下载并安装MAC补丁. 创建虚拟机. 设置ISO文件. 开启虚拟机. 安装vmware tools. 1. 下载并安装vmware.我是直接在腾 ...
- PHP 字符串变量
PHP 字符串变量 字符串变量用于存储并处理文本. PHP 中的字符串变量 字符串变量用于包含有字符的值. 在创建字符串之后,我们就可以对它进行操作了.您可以直接在函数中使用字符串,或者把它存储在变量 ...
- How to Change Default Web ADI Upload Parameters for FlexField Import / Validation
How to Change Default Web ADI Upload Parameters for FlexField Import / Validation (文档 ID 553345.1) 转 ...
- springMVC源码分析--ViewNameMethodReturnValueHandler返回值处理器(三)
之前两篇博客springMVC源码分析--HandlerMethodReturnValueHandler返回值解析器(一)和springMVC源码分析--HandlerMethodReturnValu ...
- iOS开源加密相册Agony的实现(六)
简介 虽然目前市面上有一些不错的加密相册App,但不是内置广告,就是对上传的张数有所限制.本文介绍了一个加密相册的制作过程,该加密相册将包括多密码(输入不同的密码即可访问不同的空间,可掩人耳目).Wi ...
- MyBatis批量新增和更新
之前有开发任务一个接口里面有大量的数据新增和更新操作,导致十分缓慢.使用了批量操作之后速度有明显提升,几乎百倍千倍的速度提升. 博主之前统计过,通过普通接口一次数据库插入大概需要200ms,对于大量新 ...
- (Java)微信之个人公众账号开发(二)——接收并处理用户消息(下)
接下来,我们再讲一下图文消息: 如图: 大家可以先从开发者文档中了解一下图文消息的一些参数: 如上图,用户回复4时,ipastor返回了几条图文消息,上图中属于多图文消息,当然还有单图文消息,图文消息 ...
- apply函数用法
procedure: (apply proc arg1 ... args) Proc must be a procedure and args must be a list. Calls proc ...