(十五)在controller之外修改$scope中的数据,双向绑定特性失效,不能自动刷新

在angularjs中通过angular.element(dom).scope()可以拿到某个dom元素关联的作用域,从而可以访问$scope中的属性和方法。但是在ng-controller函数之外修改$scope中的数据,angular的$scope是不会自动刷新的,即双向绑定特性失效。

<html>
  <head>
    <script src="angular-1.3.15.js"></script>
	<script>
        var app = angular.module('app', []);
        app.controller("myController",function($scope){
			$scope.buttonAdisable = true;
			$scope.buttonBdisable = true;

			//让a按钮可用
			$scope.enableA=function(){
				$scope.buttonAdisable=false;
			};
		});  

		// 启动模块
        angular.element(document).ready(function() {
              angular.bootstrap(document.getElementById("root_div"),["app"]);
        }); 

		// 让b按钮可用
		function enableB()
		{
			var scope = angular.element(document.getElementById('b')).scope();
			scope.buttonBdisable=false;
		}
	</script>
  </head>
  <body>
		<div id="root_div" ng-controller="myController">
			<input type="button" value="a" id="a" ng-disabled="buttonAdisable"/>
			<input type="button" value="b" id="b" ng-disabled="buttonBdisable"/>
			<br/>
			<input type="button" value="enable-a" ng-click="enableA();"/>
		</div>
		<input type="button" value="enable-b" onclick="enableB();"/>
  </body>
</head>

在浏览器运行这段代码:默认按钮a和b都是disabled状态,点击enable-a可以让a按钮变成enable,但是点击enable-b按钮b按钮仍然处于disabled状态。对比enableA和enableB函数,可以看到其实2者功能是一样的,实现方式也是一样的,唯一的差别在于enableA处于controller范围之内,而enableB则是在controller函数之外。

使用angularjs,我们的数据和方法都是封装在$scope中的,但是总有那么一些特殊情况让我们不得不自己获取$scope然后调用方法或者修改属性,这个时候我们就面临双向绑定失效的问题了。不知道这是不是angularjs的bug,如果要解决这个问题。我们可以自己手动调用$scope.$digest()来触发脏值检测,这样就可以实现$scopes中的数据刷新了。

对应上面的代码,我们只要修改enbaleB就可以完成需要的功能。

function enableB()
{
	var scope = angular.element(document.getElementById('b')).scope();
	scope.buttonBdisable=false;
	scope.$digest();
}



时间: 2024-11-09 10:27:18

(十五)在controller之外修改$scope中的数据,双向绑定特性失效,不能自动刷新的相关文章

vue中v-model 数据双向绑定

表单输入绑定 v-model 数据双向绑定,只能应用在input /textare /select <div id="app"> <input type="text" v-model="msg"> <p>{{ msg }}</p> </div> <script src="vue.js"></script> <script> new

Android简易实战教程--第十五话《在外部存储中读写文件》

第七话里面介绍了在内部存储读写文件 点击打开链接. 这样有一个比较打的问题,假设系统内存不够用,杀本应用无法执行,或者本应用被用户卸载重新安装后.以前保存的用户名和密码都不会得到回显.所以,有必要注意这个问题 因此把文件保存到sd卡中.即今天所写的  第十五话<在外部存储中读写文件> 首先布局文件和第七话一样: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:

AngularJS学习--- AngularJS中数据双向绑定(two-way data-binding) orderBy step4

1.切换工作目录 git checkout step-4 #切换分支,切换到第4步 npm start #启动项目 2.代码 app/index.html Search: <input ng-model="query"> Sort by: <select ng-model="orderProp"> <option value="name">Alphabetical</option> <opti

angular.js 中同步视图和模型数据双向绑定,$watch $digest $apply 机制

Angular.js 中的特性,双向绑定. 让视图的改变直接反应到数据中,数据的改变又实时的通知到视图,如何做到的? 这要归功于 scope 下面3个重要的方法: $watch $digest $apply 他们的区别是什么,我们来介绍下: $watch 这是一个监听 scope 上数据的监听器 方法说明: $scope.$watch('参数',function(newValue,oldValue){ //逻辑处理 }) 上面我们就是创建了一个监听器. ‘参数’ 就是$scope对象下的一个对象

ng1中 如何用双向绑定 实现单向绑定的初始时不显示双括号效果?

ng1中 如何用双向绑定 实现单向绑定(ng-bind就可以不显示{{}})的初始时不显示双括号效果? AngularJS 实例 页面加载时防止应用闪烁: <div ng-app=""> <p ng-cloak>{{ 5 + 5 }}</p> </div> 尝试一下 » 定义和用法 ng-cloak 指令用于在 AngularJS 应用在加载时防止 AngularJS 代码未加载完而出现的问题. AngularJS 应用在加载时,文档可能

vue中数据双向绑定的实现原理

vue中最常见的属v-model这个数据双向绑定了,很好奇它是如何实现的呢?尝试着用原生的JS去实现一下. 首先大致学习了解下Object.defineProperty()这个东东吧! * Object.defineProperty() * 对对象的属性进行 定义/修改 * */ let obj = {x:10} // 这两种方式都相对来说比较简单,直接,但是有些时候我们需要对对象的属性的修改和增加进行必要的干预 // obj.y = 20; // obj.x = 100; // obj.x =

vue中数据双向绑定注意点

最近一个vue和element的项目中遇到了一个问题: 动态生成的对象进行双向绑定是失败 直接贴代码: <el-form :model="addClass" :rules="rules" ref="addClass"> <el-form-item label="表单分类名称" prop="NAME" :label-width="formLabelWidth"> &

3. 数据双向绑定、ref获取vue中DOM节点

1. 数据的双向绑定 v-model 指令可以实现数据的双向绑定 2. ref获取vue中的DOM节点 注意:节点元素必须使用"ref" 定义一个唯一值,用于定位 原文地址:https://www.cnblogs.com/qfshini/p/12111009.html

(二十五)unity4.6学习Ugui中文文档-------UGUI-Extensions

?? 出处:http://blog.csdn.net/u010019717 这个库是什么? 在此存储库中是扩展脚本来增强您的Unity UI experience的集合.这些脚本从许多来源收集和合并,随着时间的推移改善Unity UI experience.(脚本绝大多数来自脚本线程上unity UI 论坛在这里)你可以下载/项目访问脚本,或您可以下载此预编译的 Unity Asset资产. Unity UI Extensions Unity Asset Controls and extensi