Angular中使用 watch监听object属性值的变化

本文详细解析了Angular框架中$watch方法的使用技巧,尤其关注于如何监听对象内部属性的变化,并通过示例代码展示了如何正确配置$watch以实现深度监听,确保即使对象属性发生变化也能及时捕获。

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                       

Angular中的$watch可以监听属性值的变化,然后并做出相应处理。
常见用法:

$scope.$watch("person", function(n, o){    //todo something...})
  
  • 1
  • 2
  • 3

但是对于一个对象中的某个属性值变化时,$watch似乎不管用了。
示例代码:

<body>    <div ng-controller="mainCtrl">        <input id="myText" type="text" ng-model="person.name"/>        <h2>{{person}}</h2>        <h2>Status: {{status}}</h2>    </div>    <script>    angular.module('myApp', [])        .controller('mainCtrl', function ($scope) {            $scope.person = {                name:"allen",                age:21            }            $scope.$watch("person", function(n, o){                //取消第一次加载时的监听响应                if(n == o){                    return;                }                $scope.status = "changed"            })    })</script></body>
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

我们为输入框绑定了person对象的name属性,然而当我们改变输入框的值时候,{{person}}确实改变了,然而并没有出现我们想要的change字符。

效果:
这里写图片描述

我们需要为$watch方法额外添加一个true参数,使之达到我们想要的效果:

$scope.$watch("person", function(n, o){    if(n == o){        return;    }    $scope.status = "changed";},true)
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

$watch方法完整的使用方式是这样的:

$watch(watchExpression, [listener], [objectEquality]);
  
  • 1

第一个是监听的参数名称,剩下两个可选参数分别为处理函数和是相等比较的方式,对于后者文档如是说:Compare for object equality using angular.equals instead of comparing for reference equality. 即是否使用angular.equals方法进行比较。

如此效果变为:
这里写图片描述




此文档的作者:justforuse
Github Pages:justforuse

           

给我老师的人工智能教程打call!http://blog.youkuaiyun.com/jiangjunshow
这里写图片描述
<think>我们正在讨论如何在编程中监听变量变化,并在变量变为false时触发操作。 注意:不同编程语言和框架可能有不同的实现方式。这里我将提供几种常见场景的示例。 1. **纯JavaScript(无框架)**:使用`Object.defineProperty`或`Proxy`实现监听。 2. **Vue.js**:Vue提供了直接的watch选项。 3. **React**:通过useEffect钩子监听状态变化。 4. **其他框架/环境**(如Angular, 小程序等)也有各自的方式。 由于问题没有指定具体语言或框架,我将给出几种常见情况的示例。 ### 1. 纯JavaScript(使用Proxy) 在纯JavaScript中,我们可以使用Proxy对象来监听一个对象属性变化。 ```javascript // 创建一个对象,其中包含我们要监听的变量 let state = { myVar: true // 初始值 }; // 创建代理来监听变化 let stateProxy = new Proxy(state, { set: function(target, property, value) { // 当属性被设置时调用 if (property === 'myVar') { // 检查新值是否为false,且旧值不是false(避免首次设置或重复设置触发) if (value === false && target[property] !== false) { console.log('myVar became false!'); // 在这里执行你的操作 } } target[property] = value; // 设置属性值 return true; } }); // 测试 stateProxy.myVar = false; // 会触发控制台输出 ``` ### 2. Vue.js 在Vue中,我们可以使用`watch`选项来监听数据属性变化。 ```javascript new Vue({ data: { myVar: true }, watch: { myVar(newVal, oldVal) { if (newVal === false) { console.log('myVar became false!'); // 执行操作 } } } }); ``` 或者使用Vue实例的`$watch`方法: ```javascript const vm = new Vue({ data: { myVar: true } }); vm.$watch('myVar', function(newVal, oldVal) { if (newVal === false) { console.log('myVar became false!'); // 执行操作 } }); ``` ### 3. React (使用useEffect钩子) 在函数式组件中,我们可以使用`useEffect`钩子来监听状态的变化。 ```jsx import React, { useState, useEffect } from 'react'; function MyComponent() { const [myVar, setMyVar] = useState(true); useEffect(() => { if (myVar === false) { console.log('myVar became false!'); // 执行操作 } }, [myVar]); // 依赖数组中包含myVar,当myVar变化时执行 return ( // ...组件的JSX... ); } ``` ### 4. 其他环境 例如在Angular中,可以使用`@Input()`结合`ngOnChanges`生命周期钩子,或者使用`Observable`来监听。 由于问题范围较广,以上仅列举了部分常见场景。具体实现需根据实际技术栈调整。 §§相关问题§§ 1. 如何监听多个变量的变化? 2. 在Vue3中使用Composition API如何监听变量? 3. 在React中,如何避免监听变量变化时重复执行操作? 4. 使用Proxy监听对象时,如何深度监听嵌套对象的变化?</think>在编程中监听变量变化并触发操作,可通过不同语言和框架提供的机制实现。以下是常见场景的实现方案: ### 1. Vue.js 方案 Vue 提供原生 `watch` API 监听变量变化: ```javascript // 选项式 API export default { data() { return { targetVar: true } }, watch: { targetVar(newVal, oldVal) { if (newVal === false) { this.handleFalseState(); // 触发操作 } } }, methods: { handleFalseState() { console.log('变量变为 false!'); // 执行具体操作... } } } // 组合式 API import { ref, watch } from 'vue'; const targetVar = ref(true); watch(targetVar, (newVal) => { if (!newVal) { console.log('检测到 false!'); // 执行操作... } }); ``` ### 2. React 方案 使用 `useEffect` 钩子监听状态变化: ```jsx import { useState, useEffect } from 'react'; function App() { const [targetVar, setTargetVar] = useState(true); useEffect(() => { if (targetVar === false) { console.log('状态变为 false'); // 执行操作... } }, [targetVar]); // 依赖数组指定监听变量 return ( <button onClick={() => setTargetVar(false)}> 触发状态变化 </button> ); } ``` ### 3. JavaScript 原生方案 使用 `Proxy` 对象实现数据监听: ```javascript const data = { targetVar: true }; const proxy = new Proxy(data, { set(target, key, value) { if (key === 'targetVar' && value === false) { console.log('检测到变化!'); // 执行操作... } target[key] = value; return true; } }); // 触发监听 proxy.targetVar = false; // 控制台输出"检测到变化!" ``` ### 4. 其他框架方案 - **Angular**:使用 `@Input()` + `ngOnChanges` 生命周期钩子 - **小程序**:使用 `observers` 监听器 - **Node.js**:使用 `Object.defineProperty` 或第三方库如 `MobX` ### 关键注意事项 1. **性能优化**:避免在监听器中执行重操作,Vue 可使用 `{ deep: true }` 深度监听对象[^1] 2. **防抖处理**:高频变化时添加防抖逻辑 ```javascript watch(targetVar, _.debounce((newVal) => { if (!newVal) { /* 操作 */ } }, 300)); ``` 3. **内存管理**:React 的 `useEffect` 需返回清理函数,Vue 组件卸载时自动清除监听[^2] > 选择方案时需考虑框架特性:Vue 的响应式系统自动跟踪依赖,React 需显式声明依赖数组,原生 JS 方案适用于轻量场景。 [^1]: Vue 深度监听文档:https://vuejs.org/guide/essentials/watchers.html#deep-watchers [^2]: React useEffect 清理机制:https://react.dev/reference/react/useEffect#useeffect
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值