数据双向绑定页面无反应(angularjs)
问题引入
使用 angularjs进行过一段时间的开发后,基本上都会遇到一个这样的坑:页面进行了双向数据绑定,控制层的数据也已经改变了,但是视图层的数据却没有改变。
其实造成这个问题的原因大致分为以下几个
- scope作用域发生的继承
- 操作了dom层,数据更改,却没有触发angularjs的服务。没有更新视图层。
scope作用域的继承
先看个实例。
<div ng-controller="TestCtrl">
<p>{{name}}</p>
<div ng-if="show">
<input type="text" ng-model="name">
</div>
</div>
<script>
function TestCtrl($scope){
$scope.show = true;
$scope.name = 'htf';
}
</script>
上面的code,按道理说,我们在改变input的值时,变量name的值应该会因为数据的双向绑定而进行改变,与input的value保持一致。
但是,实际上却没有发生视图上的变化。原因就是因为ng-if会隔离作用域,创建新的作用域。使得scope.name压根与input里的name不是一个作用域上的值,自然无法做出更改。
作用域
每个 Angular 应用默认有一个根作用域 $rootScope, 根作用域位于最顶层,从它往下挂着各级作用域。
通常情况下,页面中 ng-model 绑定的变量都是在对应的 Controller 中定义的。如果一个变量未在当前作用域中定义,JavaScript 会通过当前 Controller 的 prototype 向上查找,也就是作用域的继承。
这种情况也可以通过scope.$parent进行访问。
那么,如果上下级作用域想共用变量怎么办呢?引用类型变量
答案是使用引用类型变量。
<div ng-controller="OuterCtrl">
<p>{{x}}</p>
<div ng-controller="InnerCtrl">
<input type="text" ng-model="x">
</div>
</div>
<script>
function OuterCtrl($scope){
$scope.data = {};
$scope.data.x = 'hello';
}
function InnerCtrl($scope){
}
</script>
如上,便可实现理想中的数据双向绑定。
ng-if中的作用域
在这种情况下,两者的 data 是同一个引用,对这个对象上面的属性修改,是可以反映到两级对象上的。
前面讲的是两级控制器之间的作用域,那跟前面提到的问题有什么关系呢?那个看着不是只有一个 Controller 吗?
其实,并不是只有 Controller 可以创建作用域,ng-if 等指令也会(隐式地)产生新作用域。
总结下来就是,ng-if、 ng-switch 、 ng-include 等会动态创建一块界面的东西,都是自带一级作用域。
因此,在开发过程中,为了避免模板中的变量歧义,应当尽可能使用命名限定,比如 data.x,出现歧义的可能性就比单独的 x要少得多。
总结
始终将页面中的元素绑定到对象的属性(data.x)而不是 直接绑定到基本变量(x)上。
数据双向绑定页面无反应(angularjs)的更多相关文章
- 我的angularjs源码学习之旅3——脏检测与数据双向绑定
前言 为了后面描述方便,我们将保存模块的对象modules叫做模块缓存.我们跟踪的例子如下 <div ng-app="myApp" ng-controller='myCtrl ...
- AngularJS中数据双向绑定(two-way data-binding)
1.切换工作目录 git checkout step-4 #切换分支,切换到第4步 npm start #启动项目 2.代码 app/index.html Search: <input ng-m ...
- Jquery实现数据双向绑定(赋值和取值),类似AngularJS
<!DOCTYPE html> <html> <head> <meta name="viewport" content="wid ...
- Angular数据双向绑定
Angular数据双向绑定 AngularJS诞生于2009年,由Misko Hevery 等人创建,后为Google所收购.是一款优秀的前端JS框架,已经被用于Google的多款产品当中.Angul ...
- vuejs数据双向绑定原理(get & set)
前端的数据双向绑定指的是view(视图)和model(数据)两者之间的关系:view层是页面上展示给用户看的信息,model层一般是指通过http请求从后台返回的数据.view到model的绑定都是通 ...
- Vue数据双向绑定原理及简单实现
嘿,Goodgirl and GoodBoy,点进来了就看完点个赞再go. Vue这个框架就不简单介绍了,它最大的特性就是数据的双向绑定以及虚拟dom.核心就是用数据来驱动视图层的改变.先看一段代码. ...
- 深入理解Proxy 及 使用Proxy实现vue数据双向绑定
阅读目录 1.什么是Proxy?它的作用是? 2.get(target, propKey, receiver) 3.set(target, propKey, value, receiver) 4.ha ...
- 【学习笔记】剖析MVVM框架,简单实现Vue数据双向绑定
前言: 学习前端也有半年多了,个人的学习欲望还比较强烈,很喜欢那种新知识在自己的演练下一点点实现的过程.最近一直在学vue框架,像网上大佬说的,入门容易深究难.不管是跟着开发文档学还是视频教程,按步骤 ...
- 前端笔记之微信小程序(二){{}}插值和MVVM模式&数据双向绑定&指令&API
一.双花括号{{}}插值和MVVM模式 1.1 体会{{}}插值 index.wxml的标签不是html的那些标签,这里的view就是div. {{}}这样的插值写法,叫做mustache语法.mus ...
随机推荐
- HDU 4745 Two Rabbits ★(最长回文子序列:区间DP)
题意 在一个圆环串中找一个最长的子序列,并且这个子序列是轴对称的. 思路 从对称轴上一点出发,向两个方向运动可以正好满足题意,并且可以证明如果抽选择的子环不是对称的话,其一定不是最长的. 倍长原序列, ...
- POJ 2891 中国剩余定理的非互质形式
中国剩余定理的非互质形式 任意n个表达式一对对处理,故只需处理两个表达式. x = a(mod m) x = b(mod n) km+a = b (mod n) km = (a-b)(mod n) 利 ...
- tcpdump 使用实例
详细的文档见tcpdump高级过滤技巧 基本语法 ========过滤主机--------- 抓取所有经过 eth1,目的或源地址是 192.168.1.1 的网络数据# tcpdump -i eth ...
- element UI 中DateTimePicker 回传时间选择
之前在项目中用vue和element,日期和时间选择用的element2.0 的DateTimePicker 日期选择后提交没问题,在编辑页面通过后端返回时间字符串(敲黑板,这里是重点)绑定也没洒问题 ...
- Factorialize a Number
计算一个整数的阶乘 如果用字母n来代表一个整数,阶乘代表着所有小于或等于n的整数的乘积. 阶乘通常简写成 n! 例如: 5! = 1 * 2 * 3 * 4 * 5 = 120 当你完成不了挑战的时候 ...
- LeetCode OJ:Palindrome Partitioning(回文排列)
Given a string s, partition s such that every substring of the partition is a palindrome. Return all ...
- New Concept English three (24)
33 72 We often read in novels how a seemingly respectable person or family has some terrible secret ...
- vue.js 源代码学习笔记 ----- 工具方法 env
/* @flow */ /* globals MutationObserver */ import { noop } from 'shared/util' // can we use __proto_ ...
- 在ROS Kinetic中使用Gazebo 8进行机器人仿真
在ROS Kinetic中使用Gazebo 8比在ROS Indigo中使用Gazebo 3-8要容易一些. 目前最新稳定版本的Gazebo8为8.1.1. 安装流程如下: $ sudo apt-g ...
- ET之快递测试法学习感悟20140922
快递测试法,是从ET学习中了解到的一种测试方法,顾名思义就是数据类似于那些通过联邦快递系统在这个星球上被不断移动的包裹一样,在软件中也不断的流动.数据从被输入后就开始了它的生命周期,先被存储在内部变量 ...