优化Angularjs的$watch方法

简介: Angularjs的$watch相信大家都知道,而且也经常使用,甚至,你还在为它的某些行为感到恼火。比如,一进入页面,它就会调用一次,我明明希望它在我初始化之后,值再次变动才调用。这种行为给我们带来许多麻烦。

Angularjs的$watch相信大家都知道,而且也经常使用,甚至,你还在为它的某些行为感到恼火。比如,一进入页面,它就会调用一次,我明明希望它在我初始化之后,值再次变动才调用。这种行为给我们带来许多麻烦。而我们今天就是要优化$watch的写法,来解决这些问题。

一.推荐写法:

$scope.$watch('xxx',function(newVal,oldVal){
if(newVal === oldVal || oldVal==undefined){
  //不执行代码
}else{
  //执行你的代码
}})

为什么这么写?听我慢慢道来。

1.newVal===oldVal

首先,我们做一个测试。

$scope.$watch('name',function(newVal,oldVal){
    console.log('oldVal',oldVal)        //undefined
    console.log('newVal',newVal)        //undefined
    if(newVal === oldVal || oldVal==undefined){
    //不执行代码
    }else{
  //执行你的代码
    }
})

我们监听name的改变,一开始进来,没有初始化时,都为undefined。

然后,我们先定义name

$scope.name="张三";
$scope.$watch('name',function(newVal,oldVal){
    console.log('oldVal',oldVal)        //张三
    console.log('newVal',newVal)        //张三
    if(newVal === oldVal || oldVal==undefined){
    //不执行代码
    }else{
  //执行你的代码
}})

可以看到,一开始进来就都是张三。
由此可知,当监听器函数初始化时,newVal和oldVal总是相等的,所以,此时我们可以判断两个值是否相等,来执行我们想要的操作。

2.oldVal==undefined

为什么要判断oldVal==undefined?因为,当我们给name赋值的时候,会有一个undefinde变为有值的过程。所以当你不想在第一次赋值时,就执行方法,这么干就对了。
我们给name的赋值套一个timeout,模仿异步调用,在实际项目中,我们的name通常都是从接口获取的。

$timeout(function(){
$scope.name="张三";
},500)

然后,你再观察一下watch

$scope.$watch('name',function(newVal,oldVal){
    console.log('oldVal',oldVal)        //undefined
    console.log('newVal',newVal)        //张三
    if(newVal === oldVal || oldVal==undefined){
    //不执行代码
    }else{
  //执行你的代码
}})

以上就是watch需要注意的一些事项。然后,我们接下来讨论的是如何监听数组的变化,这就要用到另一个监听方法,$watchCollection。

二.watchCollection

大家,可以运行以下代码 出来的样子长这样

好好观察一下watch和watchCollection的行为,可以发现watch是监听不到数组的变化的,所以,如果你要监听的是一个数组的话,请用watchCollection代替watch.

以上两点就是今天要说的优化,当然$watch还有很多其他内容,感兴趣的小伙伴可以继续研究一下。

相关文章
|
Dubbo Java 应用服务中间件
微服务框架(十四)Spring Boot @ControllerAdvice异常处理
此系列文章将会描述Java框架Spring Boot、服务治理框架Dubbo、应用容器引擎Docker,及使用Spring Boot集成Dubbo、Mybatis等开源框架,其中穿插着Spring Boot中日志切面等技术的实现,然后通过gitlab-CI以持续集成为Docker镜像。   本文为Spring Boot使用@ControllerAdvice进行自定义异常捕捉
|
6月前
|
人工智能 IDE 测试技术
通义灵码2.0 - AI 程序员: AI 编程新时代的卓越助力
通义灵码是一款强大的AI编程助手,尤其在单元测试自动生成方面表现出色。它通过简化操作流程,快速生成覆盖广泛、质量较高的测试用例,支持直接编译与运行,显著提升开发效率。相比人工编写,通义灵码能大幅缩短时间成本,并更全面地覆盖边界和异常情况,但特定业务逻辑仍需人工补充。作为开发者的好帮手,它助力高效完成高质量单元测试,推动软件开发迈向新台阶。
26875 84
|
10月前
|
SQL 算法 Java
快出数量级的性能是怎样炼成的
我们通过使用开源 SPL 重写了多个金融行业的 SQL 任务,实现了显著的性能提升,如保险公司团保明细单查询提速 2000+ 倍、银行 POS 机交易报表提速 30+ 倍等。这些优化的核心在于使用了更低复杂度的算法,而非依赖硬件加速。SPL 基于离散数据集理论,提供了丰富的高性能算法,使得复杂任务的优化成为可能。更多案例和详细技术解析可参见乾学院的相关课程和图书。
|
6月前
|
运维 Kubernetes Java
Koupleless 助力「人力家」实现分布式研发集中式部署,又快又省!
通过引入Koupleless框架,解决了多应用部署中资源浪费和运维成本高的问题,实现了模块瘦身、快速部署及流量控制优化,大幅降低了服务器资源占用和发布耗时,提升了系统稳定性和运维效率。最终,人力家成功实现了多应用的轻量集中部署,显著减少了运维成本。
 Koupleless 助力「人力家」实现分布式研发集中式部署,又快又省!
|
7月前
|
数据采集 JSON 监控
速卖通商品列表接口(以 AliExpress Affiliate 商品查询 API 为例)
以下是使用 Python 调用速卖通商品列表接口(以 AliExpress Affiliate 商品查询 API 为例)的代码示例。该示例包含准备基础参数、生成签名、发送请求和处理响应等关键步骤,并附有详细注释说明。代码展示了如何通过公共参数和业务参数构建请求,使用 HMAC-SHA256 加密生成签名,确保请求的安全性。最后,解析 JSON 响应并输出商品信息。此接口适用于商品监控、数据采集与分析及商品推荐等场景。注意需通过 OAuth2.0 获取 `access_token`,并根据官方文档调整参数和频率限制。
|
开发框架 前端开发 关系型数据库
使用egg.js开发后端API接口系统 什么是Egg.js
使用egg.js开发后端API接口系统 什么是Egg.js
|
11月前
|
缓存 关系型数据库 MySQL
MySQL慢查询优化
通过上述方法综合施策,可以显著提升MySQL数据库的查询性能,降低延迟,增强应用系统的整体响应能力。实践中,优化工作是一个持续迭代的过程,需要结合具体应用场景不断调整策略。
801 1
|
SQL 运维 Oracle
入门级Oracle 11g日常运维命令总结
入门级Oracle 11g日常运维命令总结
435 1
|
11月前
|
搜索推荐 数据挖掘 数据处理
NVIDIA Triton系列12-模型与调度器2
本文介绍了NVIDIA Triton服务器的“集成推理”功能,涵盖“集成模型”与“集成调度器”两部分,通过示例说明了如何构建一个包含图像预处理、分类和语义分割的推理流水线,强调了模型间数据张量的连接与处理,以及配置集成模型和调度器的具体步骤。
203 1
NVIDIA Triton系列12-模型与调度器2
|
编解码 Linux
FFmpeg开发笔记(二十五)Linux环境给FFmpeg集成libwebp
《FFmpeg开发实战》书中指导如何在Linux环境下为FFmpeg集成libwebp以支持WebP图片编解码。首先,从GitHub下载libwebp源码,解压后通过`libtoolize`,`autogen.sh`,`configure`,`make -j4`和`make install`步骤安装。接着,在FFmpeg源码目录中重新配置并添加`--enable-libwebp`选项,然后进行`make clean`,`make -j4`和`make install`以编译安装FFmpeg。最后,验证FFmpeg版本信息确认libwebp已启用。
255 1
FFmpeg开发笔记(二十五)Linux环境给FFmpeg集成libwebp