angularJS开发注意事项


Posted in Javascript onMay 26, 2018

作为一个coder,应该具有经常总结反思的习惯,如果不能及时总结,可能就会忘记自己踩过的很多坑,然后会导致同一个坑踩很多次,所以我打算把这些都记录下来,以方便是对自己的重复记忆,避免无效的coding,另一方面可以希望可以给遇到相似问题的同僚们一些收获.

1.手动触发脏检查

在开发过程中,我们可能经常会通过js来手动更改绑定的相关数据,而不是通过dom操作来改变绑定的相关数据,这样也很多情况下会导致绑定数据的视图不能够及时更新,这个时候就需要我们手动触发一下脏检查,下面我就介绍一下三种手动触发脏检查的方法.

(1) apply()方法在需要手动触发的地方调用scope.apply(),使用该方法会触发angular从rootScope的作用域下开始进行绑定变量值的轮询,相比较digest()方法比较费时.

但是这个有时这个方法会报错.

(2) digest()方法在需要手动触发的地方调用scope.digest(),使用该方法会触发angular从scope的作用域下开始进行绑定变量值的轮询,相比较aplly()更合理.

(3) timeout()方法将操作绑定数据的逻辑写在timeout()方法中.

找到一种更完美的解决动态添加数据导致页面不能及时渲染的方法,迫不及待地来分享给大家~~~

可以定义一个全局的方法.这个方法就是经过处理过的apply函数,大家都叫它safeApply.上代码了:

$rootScope.safeApply = function(fn) {
  var phase = this.$root.$$phase;
  if(phase == '$apply' || phase == '$digest') {
    if(fn && (typeof(fn) === 'function')) {
      fn();
    } else {
      this.$apply(fn);
    }
  }
}

然后在需要动态添加吧的地方调用rootScope.safeApply()即可,或者把需要动态添加的代码作为写进rootScope.safeApply方法的fn参数里.

2.ng-model-options 指令

这个指令在表单校验的时候非常有用,我们可以设置什么时候出发试图更新,这样你就可以设置dom元素失去焦点改变后调用监听,从而显示校验的提示. <input>, <select>, <textarea>,这些元素支持该指令

<input ng-model="name" ng-model-options="{updateOn: 'blur'}"> //使用示例

//可配置参数

{updateOn: 'event'}规则指定事件发生后绑定数据
{debounce : 1000} 规定等待多少毫秒后绑定数据
{allowInvalid : true|false} 规定是否需要验证后绑定数据
{getterSetter : true|false} 规定是否作为 getters/setters 绑定到模型
{timezone : '0100'} 规则是否使用时区

3. 告别令人尴尬的 {{}}

我们都知道,当页面还未加载完毕的时候会出现{{ xxx }}这种尴尬的情况,通过使用ng-bind-template指令,就可以避免尴尬情况的出现.

<p ng-bind-template="{{name}}"></p>   //使用示例

4.解决ng-if,ng-show,ng-hide偶然出现的闪现的问题

(1) 将html片段抽出,通过指令引入ng-include,ng-bind-html

(2) 通过ng-cloak指令

5.控制器之间的通讯问题

(1)路由传参

//传递
$state.go(path, {name:"dfdd"})
ui-sref="path({name:"dfdd"})"
//获取
$scope.$stateParams.name

(2)通过广播

通过子元素传递给父元素,然后父元素再广播给其他子元素,注意这个广播是很快就完成的,所以很有可能出现子页面还未加载完父元素的广播就已经完成了,为了避免这种情况,需要父元素的广播延迟执行.
(这种情况有一个弊端,当进入子页面后再次刷新页面,这次的广播已经没有了,就会导致这个子页面的数据获取失败了.)

(3)定义全局变量(window)

将多个控制器都需要通讯的变量定义为全局的.这样每个控制器都可以访问到和改写.

(4) 缓存

sessionStorage, localStorage, cookie,浏览器的各种数据库

以上方法个人比较推荐路由传参的方式

6.$destroy的使用是必要的

  • (1)页面离开时清除页面的定时器
  • (2)页面离开时清除页面的监听器
  • (3)页面离开时清除页面的modal,popover之类的遮罩层.
var destroyWatcher = $scope.$watch(...);
//示例代码
//$watch方法会返回一个函数,这个函数用来销毁监听器,我们用一个变量承接这个函数,然后再destory的时候调用这个函数就可以销毁不必要的监听器了.
$scope.$on("$destroy", function() {
  if (timer) { 
    $timeout.cancel(timer); 
  } 
  $scope.popover.remove();
  destroyWatcher();
}
Javascript 相关文章推荐
使用jQuery和PHP实现类似360功能开关效果
Feb 12 Javascript
jQuery如何取id有.的值一般的方法是取不到的
Apr 18 Javascript
jQuery中data()方法用法实例
Dec 27 Javascript
JavaScript使用setInterval()函数实现简单轮询操作的方法
Feb 02 Javascript
JavaScript中eval()函数用法详解
Dec 14 Javascript
整理JavaScript对DOM中各种类型的元素的常用操作
May 05 Javascript
浅析js的模块化编写 require.js
Dec 07 Javascript
用file标签实现多图文件上传预览
Feb 14 Javascript
Linux使用Node.js建立访问静态网页的服务实例详解
Mar 21 Javascript
移动web开发之touch事件实例详解
Jan 17 Javascript
Node.js爬虫如何获取天气和每日问候详解
Aug 26 Javascript
vue 解决addRoutes多次添加路由重复的操作
Aug 04 Javascript
JavaScript继承与多继承实例分析
May 26 #Javascript
jquery ajaxfileuplod 上传文件 essyui laoding 效果【防止重复上传文件】
May 26 #jQuery
Vue仿支付宝支付功能
May 25 #Javascript
微信小程序实现人脸检测功能
May 25 #Javascript
微信小程序实现人脸识别
May 25 #Javascript
微信小程序实现刷脸登录
May 25 #Javascript
JS实现生成由字母与数字组合的随机字符串功能详解
May 25 #Javascript
You might like
数据库中排序的对比及使用条件详解
2012/02/23 PHP
PHP+jQuery 注册模块的改进(三):更新到Smarty3.1
2014/10/14 PHP
配置php.ini实现PHP文件上传功能
2014/11/27 PHP
THINKPHP内容分页代码分享
2015/01/14 PHP
PHP使用array_merge重新排列数组下标的方法
2015/07/22 PHP
php用正则判断是否为数字的方法
2016/03/25 PHP
php无限级分类实现评论及回复功能
2019/02/18 PHP
浅谈laravel-admin的sortable和orderby使用问题
2019/10/03 PHP
laravel 根据不同组织加载不同视图的实现
2019/10/14 PHP
如何在标题栏显示框架内页面的标题
2007/02/03 Javascript
使用jQuery管理选择结果
2015/01/20 Javascript
基于jquery实现三级下拉菜单
2016/05/10 Javascript
JQuery手速测试小游戏实现思路详解
2016/09/20 Javascript
Vue.js实现按钮的动态绑定效果及实现代码
2017/08/21 Javascript
Electron autoUpdater实现Windows安装包自动更新的方法
2018/12/24 Javascript
Vue基于vuex、axios拦截器实现loading效果及axios的安装配置
2019/04/26 Javascript
Vue实现点击箭头上下移动效果
2020/06/11 Javascript
让python 3支持mysqldb的解决方法
2017/02/14 Python
老生常谈python函数参数的区别(必看篇)
2017/05/29 Python
Django给admin添加Action的步骤详解
2019/05/01 Python
Python 获取ftp服务器文件时间的方法
2019/07/02 Python
Python pandas.DataFrame 找出有空值的行
2019/09/09 Python
使用virtualenv创建Python环境及PyQT5环境配置的方法
2019/09/10 Python
PyCharm 无法 import pandas 程序卡住的解决方式
2020/03/09 Python
keras读取训练好的模型参数并把参数赋值给其它模型详解
2020/06/15 Python
德国在线购买葡萄酒网站:Geile Weine
2019/09/24 全球购物
YBF Beauty官网:美丽挚友,美国知名彩妆品牌
2020/11/22 全球购物
这76道Java面试题及答案,祝你能成功通过面试
2016/04/16 面试题
小学生期末自我鉴定
2014/01/19 职场文书
新教师培训方案
2014/06/08 职场文书
人事行政主管岗位职责
2015/04/09 职场文书
2015年学校总务处工作总结
2015/05/19 职场文书
2016八一建军节慰问信
2015/11/30 职场文书
2019年英语版感谢信(8篇)
2019/09/29 职场文书
如何用JS实现简单的数据监听
2021/05/06 Javascript
php+laravel 扫码二维码签到功能
2021/05/15 PHP