`
haoningabc
  • 浏览: 1477893 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

angularjs使用include后双向绑定失败的解决

阅读更多
原理参考
http://segmentfault.com/q/1010000000738004/a-1020000000738812
http://blog.csdn.net/dm_vincent/article/details/38705099
解决参考
http://segmentfault.com/q/1010000002877397
http://blog.51yip.com/jsjquery/1598.html
正常是双向绑定如下
<!DOCTYPE html>
<html ng-app="myapp">
<head>
    <meta charset="utf-8">
    <title>ng-model directive</title>
</head>
<body ng-controller="HelloController">
<script src="angular.min.js"></script>
<script>
	var app=angular.module("myapp",[]);
    app.controller("HelloController",function($rootScope,$scope) {
    	$scope.greeting="haoning";
    
        $scope.consoleng = function() {
            console.log($scope.greeting) ;
        }
        
    });
</script>

<div>
    <p>bbbbbbbbb</p>
    <input id="thism" ng-model="greeting" >
    <p>Hello {{greeting || "World"}}</p>
    <button ng-click="consoleng()" >dayin</button>
    <button ng-click="cha()">cha</button>
    <hr>
</div>
</body>
</html>

$scope.greeting与ng-model="greeting"
绑定,党model变了,打印的scope的greeting也变了


然而如果引入了ng-include 的子页面
在子页面改了model之后,scope中的数据没有如期改变

需要处罚apply方法使数据改变,apply又存在安全问题,
解决办法如下

外层的为
out.html
<!DOCTYPE html>
<html ng-app="myapp">
<head>

    <meta charset="utf-8">
    <title>ng-model directive</title>
</head>
<body ng-controller="HelloController">

 
<script src="angular.min.js"></script>
<script>
	var app=angular.module("myapp",[]);
    app.controller("HelloController",function($rootScope,$scope) {
    	$scope.safeApply = function(fn) {
		    var phase = this.$root.$$phase;
		    if (phase == '$apply' || phase == '$digest') {
		        if (fn && (typeof(fn) === 'function')) {
		            fn();
		        }
		    } else {
		        this.$apply(fn);
		    }
		};
    	$scope.greeting="haoning";
    
        $scope.consoleng = function() {
            console.log($scope.greeting) ;
        }
        $rootScope.cha = function() {
        	console.log("cha");
           	$scope.safeApply(function () {  
           		$scope.greeting = document.getElementById("thism").value;  
        	});
        }
    });
</script>

<div ng-include="'inner.html'" 
            class="sidebar sidebar-right"></div>
</body>
</html>

内层的为
inner.html
<div>
    <p>bbbbbbbbb</p>
    <input id="thism" ng-model="greeting" >
    <p>Hello {{greeting || "World"}}</p>
    <button ng-click="consoleng()" >dayin</button>
    <button ng-click="cha()">cha</button>
    <hr>
</div>


使model的值改变后,手动触发一下apple那个方法,
才能改变scope中的值
分析,
加了
	$scope.safeApply = function(fn) {
		    var phase = this.$root.$$phase;
		    if (phase == '$apply' || phase == '$digest') {
		        if (fn && (typeof(fn) === 'function')) {
		            fn();
		        }
		    } else {
		        this.$apply(fn);
		    }
		};


$rootScope.cha = function() {
        	console.log("cha");
           	$scope.safeApply(function () {  
           		$scope.greeting = document.getElementById("thism").value;  
        	});
        }
分享到:
评论

相关推荐

    详解JavaScript的AngularJS框架中的作用域与数据绑定

    在AngularJS中,双向绑定通过ng-model指令来实现。 ng-controller指令用于定义应用中的控制器,它是AngularJS中将数据模型绑定到视图的主要方法。控制器负责管理应用的数据和视图之间的交互。在控制器内部,可以...

    精通AngularJS part1

    使用ng—include处理多个UI区域183 不支持嵌套路由184 65路由相关的模式及技巧185 处理链接185 创建可点击的链接186 兼容HTML5及hashbang模式186 链接外部页面187 组织路由定义187 将路由定义分离到多个模块...

    关于 angularJS的一些用法

    3. 表单验证:AngularJS提供了表单验证机制,ng-model可以用来进行双向数据绑定,并在表单提交时自动进行数据验证。例如,输入字段可以使用ng-minlength和ng-maxlength来限制最小和最大长度,使用ng-required来标记...

    详解JavaScript的AngularJS框架中的作用域与数据绑定_.docx

    在JavaScript的AngularJS框架中,作用域(Scope)和数据绑定是两个核心概念,它们极大地简化了前端开发的复杂性,特别是对于构建大型单页面应用(SPA)来说。AngularJS由Google发起,作为一款轻量级的MVC框架,它...

    AngularJS参考手册

    通过以上内容可以看出,AngularJS提供了一整套完整的解决方案,包括丰富的指令、验证属性和强大的API,能够极大地简化Web应用的开发过程。这些功能不仅可以提高开发效率,还能帮助开发者创建更加健壮和可维护的应用...

    AngularJS入门教程之AngularJS指令

    ng-model是实现数据双向绑定的关键指令,它广泛应用于表单元素,如输入框、选择框等,使得处理用户交互变得非常方便。 ng-repeat指令是AngularJS中的一个用于循环数据的指令,它能够根据提供的数组或对象集合重复...

    Angularjs输入框弹出城市地区联动选择代码

    AngularJS的核心特性之一是双向数据绑定,它使得视图和模型之间的数据同步变得简单。在这里,我们将创建一个控制器,用来管理省份、城市、区县的数据,并将这些数据绑定到视图中的选择器。 **二、项目结构** 1. **...

    深入探究AngularJS框架中Scope对象的超级教程

    在处理基本数据类型时,AngularJS不会进行双向数据绑定,而是在子Scope创建了一个新的局部变量,导致父Scope中同名属性并不会被更新。这一点是很多初学者在使用AngularJS时遇到的陷阱,尤其是在使用ng-repeat、ng-...

    详细谈谈AngularJS的子级作用域问题

    这在处理双向数据绑定时尤其需要注意,因为AngularJS的双向数据绑定是基于作用域的属性变化监听机制,而不是直接修改原型链。 对于原始类型的属性(如number、string、boolean等),它们不能直接在原型链上进行修改...

    AngularJS包括详解及示例代码

    AngularJS 的核心特性之一是双向数据绑定,它允许视图(View)和模型(Model)之间的数据自动同步。在示例中,`ng-model` 指令被用来将输入框的值与 `$scope` 中的属性关联,例如 `ng-model="student.firstName"` ...

    angularjs实现的省市区地址级联选择器

    在AngularJS中,我们可以使用`ng-model`来双向绑定数据,`ng-change`来监听下拉列表的选择变化,以及`ng-options`来渲染下拉列表的选项。假设我们有一个JSON对象,包含所有省份、城市和区县的数据,我们可以这样构建...

    its-my-first-angular-app:这是我的第一个 AngularJS 应用

    在学习这个项目时,你将了解如何设置AngularJS环境,如何组织应用结构,以及如何通过控制器和视图实现数据的双向绑定。此外,你还将掌握如何使用AngularJS的服务进行数据管理,以及如何创建和使用自定义指令来增强...

    AngularJS递归指令实现Tree View效果示例

    3. `scope`定义了指令的作用域,`treeData: '='`表示`treeData`属性是双向绑定的,允许外部数据与指令内部共享;`canChecked: '=', textField: '@', itemClicked: '&', itemCheckedChanged: '&'`分别用于处理是否...

    AngularJs实现ng1.3+表单验证

    它是AngularJs表单验证的基础,因为任何的输入元素通过ng-model与应用的数据模型绑定后,AngularJs就能自动检测输入的变化,并同步更新。 2. **ng-minlength** 和 **ng-maxlength**:这两个指令用于设置输入字段的...

    Angular directive递归实现目录树结构代码实例

    在`scope`中,我们使用`=`来定义`treeData`属性,这意味着它将与父作用域中的同名属性建立双向数据绑定。此外,我们还定义了一个`controller`,其中的`isLeaf`方法检查一个节点是否为叶子节点(即没有子节点),`...

    jsp简单实现页面之间共享信息的方法

    AngularJS的双向数据绑定功能可以用来在页面间共享信息,例如在示例中,通过AngularJS的`ng-model`指令可以将输入框中的数据绑定到变量`yourName`上。然后在子页面中,可以使用AngularJS的插值表达式`{{yourName||'...

Global site tag (gtag.js) - Google Analytics