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 相关文章推荐
一些经常会用到的Javascript检测函数
May 31 Javascript
javascript获取select值的方法分析
Jul 02 Javascript
javascript:void(0)是什么意思及href=#与href=javascriptvoid(0)的区别
Nov 13 Javascript
浅谈JavaScript前端开发的MVC结构与MVVM结构
Jun 03 Javascript
终于实现了!精彩的jquery弹幕效果
Jul 18 Javascript
浅谈JS读取DOM对象(标签)的自定义属性
Nov 21 Javascript
jquery 实现复选框的全选操作实例代码
Jan 24 Javascript
简单的vue-resourse获取json并应用到模板示例
Feb 10 Javascript
基于three.js编写的一个项目类示例代码
Jan 05 Javascript
js实现前面自动补全位数的方法
Oct 10 Javascript
javascript实现计算指定范围内的质数示例
Dec 29 Javascript
Nuxt v-bind绑定img src不显示的解决
Dec 05 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
PHP不用第三变量交换2个变量的值的解决方法
2013/06/02 PHP
PHP遍历文件夹与文件类及处理类用法实例
2014/09/23 PHP
基于php实现的php代码加密解密类完整实例
2016/10/12 PHP
Jquery Ajax学习实例7 Ajax所有过程事件分析示例
2010/03/23 Javascript
jQuery调用WebService的实现代码
2011/06/19 Javascript
简单的js表单验证函数
2013/10/28 Javascript
jquery 无限级下拉菜单的简单实现代码
2014/02/21 Javascript
实现前后端数据交互方法汇总
2015/04/07 Javascript
Javascript页面跳转常见实现方式汇总
2015/11/28 Javascript
简单介绍JavaScript数据类型之隐式类型转换
2015/12/28 Javascript
JS+CSS实现鼠标经过弹出一个DIV框完整实例(带缓冲动画渐变效果)
2016/03/25 Javascript
AngularJS实现按钮提示与点击变色效果
2016/09/07 Javascript
jQuery事件与动画基础详解
2017/02/23 Javascript
Angular2使用Angular-CLI快速搭建工程(二)
2017/05/21 Javascript
微信小程序实现图片上传、删除和预览功能的方法
2017/12/18 Javascript
JS实现留言板功能[楼层效果展示]
2017/12/27 Javascript
浅谈Vue.js 关于页面加载完成后执行一个方法的问题
2019/04/01 Javascript
微信小程序收货地址API兼容低版本解决方法
2019/05/18 Javascript
layui加载数据显示loading加载完成loading消失的实例代码
2019/09/23 Javascript
layui实现下拉复选功能的例子(包括数据的回显与上传)
2019/09/24 Javascript
Angular6项目打包优化的实现方法
2019/12/15 Javascript
JS async 函数的含义和用法实例总结
2020/04/08 Javascript
Python实现自定义读写分离代码实例
2019/11/16 Python
Python configparser模块配置文件过程解析
2020/03/03 Python
关于Python错误重试方法总结
2021/01/03 Python
使用CSS3来实现滚动视差效果的教程
2015/08/24 HTML / CSS
屈臣氏俄罗斯在线商店:Watsons俄罗斯
2020/08/03 全球购物
高级销售员求职信
2013/10/25 职场文书
热能动力工程毕业生自荐信
2013/11/07 职场文书
关于工资低的辞职信
2014/01/14 职场文书
幼儿园课题实施方案
2014/05/14 职场文书
家长给学校的建议书
2014/05/15 职场文书
最新离婚协议书范本
2014/08/19 职场文书
2015年个人实习工作总结
2014/12/12 职场文书
升学宴家长致辞
2015/07/27 职场文书
2016年习主席讲话学习心得体会
2016/01/20 职场文书