Angular属性绑定的功能探索

  • Angular的属性绑定机制不起作用
  • 探索

Angular的属性绑定机制不起作用

今天用Kendo UI for Angular的TreeList组件时发现了一个问题:
将一个数组类型的对象data作为TreeList的数据源,当向data中追加新的元素时,画面上TreeList的数据并不会立即刷新;而将data赋值null或者其他新赋值时,TreeList的数据就会立刻刷新。为什么已经将data绑定到TreeList上了,即使data的值发生了变化,画面内容没有立即改变呢?似乎Angular的属性绑定机制没有起作用一样。。

探索

Kendo UI for Angular的TreeList组件有其自己的解决办法,使用FlatBindingDirective.rebind()可以完成刷新的功能。Angular的绑定机制不就是为了让后台改变的内容自动反应到画面上么?为何已经绑定好的东西,实现真正的"绑定"功能却需要其他的方法来辅助完成呢?

关于Angular如何实现数据绑定机制的原理在网上可以搜索到很多资源,这里就不再详细说明了。
简单来说,Angular提供了一个监视器去监视被绑定的变量是否发生变化,如果监视器认为被绑定的变量发生了变化,就会将其反应到绑定该变量的组件上。

那么什么样的情况下才是 监视器认为被绑定的变量发生了变化 了呢?

页面代码

<div><input [value]="strTest" /><button (click)="testFunction1()">testFunction1</button>
</div>
<div><input [value]="strTest" /><button (click)="testFunction2()">testFunction2</button>
</div>
<div><input [value]="strTest" /><button (click)="testFunction3()">testFunction3</button>
</div>

ts代码

export class AppComponent {public strTest: string[] = ['test1', 'test2', 'test3'];public testFunction1(): void {console.log(this.strTest);this.strTest.push('test4');console.log(this.strTest);}public testFunction2(): void {console.log(this.strTest);this.strTest = ['test4'];console.log(this.strTest);}public testFunction3(): void {console.log(this.strTest);this.strTest[0] = 'testtest1';console.log(this.strTest);}
}

画面:

点击第一个按钮:

点击第二个按钮:

点击第三个按钮:

从以上示例可以看出,所谓Angular监视被绑定的对象变量,其实是监视其堆栈中的值。
对于简单数据类型,堆栈中存放的就是其值,因此一旦变量的值发生了改变,其堆栈中存放的内容就发生了改变,因此Angular的监视器便会捕捉到这一变化从而改变组件上的内容。

对于引用数据类型,堆栈中存放的是指针(引用对象的地址)。
当引用对象的值发生改变时,堆栈中的地址并没有改变,仅仅只是其地址所指向的对象发生了改变。这种情况下,Angular监视器并不认为该对象已经发生了变化,所以并不会刷新组件的内容(上面例子中的按钮一和按钮三);
当引用对象发生改变,如:被赋予了新对象…其堆栈中的地址就发生了改变。这种情况下,Angular监视器就会认为对象发生了变化,进而刷新组件的内容(上面例子中的按钮二)。

Angular属性绑定的功能探索相关推荐

  1. angular属性绑定绑定函数,插值表达式插函数,ngIf绑定函数

    以前认为angular属性绑定的时候只能绑定属性,官网上也没说能绑定函数,看同事代码的时候被惊呆了,可以绑定函数,而不仅仅是属性,可以绑定函数,而不仅仅是属性,可以绑定函数,而不仅仅是属性,整理一下相 ...

  2. Angular属性绑定,class绑定,事件绑定,属性样式绑定

    多谢大佬指正,原创转载连接. 属性绑定 插值表达式:src="{{user.pic}}" 使用: [ ] :[property]="变量" 使用:bind-:b ...

  3. Vue Angular 双向绑定检测不到对象属性的添加和删除

    由于ES5的限制 Vue  && Angular 双向绑定检测不到对象属性的添加和删除  还有数组增加索引.这些改变不会触发change事件.Vue是因为实例化的时候已经把各个属性都s ...

  4. Angular开发(三)-关于属性绑定与事件绑定

    一.新建一个项目工程并创建一个组件bind,如果还有不知道怎么创建angular项目的请先查看Angular2从环境搭建到开发建议直接用angular-cli创建 二.数据绑定 插值的方式[比较常见] ...

  5. angular条件渲染、列表渲染、属性绑定、样式绑定、事件绑定

    文章目录 属性绑定 样式绑定 绑定单一样式 绑定多个样式 用 NgStyle 设置内联样式 类绑定 绑定单个类样式 绑定到多个 CSS 类 用 NgClass 添加和删除类 条件渲染 列表渲染 *ng ...

  6. angularjs绑定属性_AngularJS隔离范围属性绑定教程

    angularjs绑定属性 We have discussed about the isolate scope and its basic usage in the previous tutorial ...

  7. 获取Angular中的AngularJS功能

    介绍 ( Introduction ) If you have solid experience with AngularJS 1.x, you're well aware of the framew ...

  8. Angular 双向绑定

    Angular10教程--2.3 双向绑定 双向绑定大致可以分成两种类型: 一.普通组件的双向绑定 二.表单中的双向绑定[(ngModel)] 单独使用表单元素 在标签中使用 总结: 前面我们了解了属 ...

  9. java mvc 绑定_关于Java:Spring MVC:将请求属性绑定到控制器方法参数

    在Spring MVC中,很容易将请求参数绑定到处理请求的方法参数. 我只是使用@RequestParameter("name"). 但是我可以对request属性做同样的事情吗? ...

最新文章

  1. Python使用正则表达式分割字符串
  2. Oracle安装笔记
  3. php 抓取页面图片,php 抓取网页内容与图片的方法
  4. 一文弄懂String的所有小秘密
  5. 数据结构Java版之排序算法(二)
  6. Windows下提升进程权限(转)
  7. C#中lock关键字的用法
  8. CSS基础选择器之标签选择器(CSS、HTML)
  9. python最适合做什么-学习Python适合就业哪些岗位?老男孩Python学习
  10. Duplicate methods named spliterator with the parameters () and () are inherited from the types Colle
  11. 【游戏开发】UE4联机渲染swarm agent配置
  12. html语言判断水仙花数,水仙花数判断讲解
  13. SOFA Weekly | QA 整理
  14. tomcat介绍和TCP传输文件的实现
  15. freetype的简单使用
  16. HTTP/HTTPS协议
  17. 职业高一计算机试题,信息技术教师考试题库
  18. C#基于NAudio的声音识别(二)——MFCC+SVM/BP
  19. 心灵震撼《一个8岁女孩的遗书》
  20. 格式化————format

热门文章

  1. java惊魂_我的世界孤儿院惊魂
  2. 89c51的万年历c语言,用AT89C51与DS1302做的万年历c语言编程
  3. H3C的l2tp报错
  4. 锋迷商城项目介绍(一)
  5. ContextCapture Master 倾斜摄影测量实景三维建模技术
  6. 全面、详细的SQL学习指南(MySQL方向)
  7. 【100%通过率】华为OD机试真题 Java 实现【预订酒店】【2022.11 Q4 新题】
  8. 淘宝推荐最靠谱的补单平台排行榜
  9. 电线超负荷的危险与原因
  10. Python基础教程目录