angularjs+directive+scope:true修改规则对引用类型数据无效,主要受原型链影响

问题

一个简单的scope:true的指令作用域中的值绑定的情况。

scope:true表明了,修改自己的值将不能影响到父级的值。然鹅,今天使用了对象类型的属性进行绑定,结果就失败了。

下面这是一个正确的例子

html

<div ng-controller="Ctrl">
    	父输入框第二层:<input type="text" ng-model="menu['菜单1']['mesWebsite']" />
    	<div ng-bind="menu['菜单1']['mesWebsite']"></div>
    	<br />
    	
     	<div website-input></div>
     	
     	父输入框:<input type="text" ng-model="mesWebsite" />
    	<div ng-bind="mesWebsite"></div>
    </div>

js部分

<script>
	angular.module('docsSimpleDirective', [])
	  .controller('Ctrl', function($scope) {
	  	$scope.menu = {
	  		'菜单1':{"name":"菜单1","mestype":2},
	  		'菜单2':{"name":"菜单2","mestype":1}
	  	};
	    $scope.nowItem = {
	      name: '菜单1',
	      mestype: 2
	    };
	    $scope.mesWebsite = '1234';
	  })
	  .directive('myDr', ['$compile', myDrFunc]);
	
	function myDrFunc($scope){
		var dom = '子输入框第二层:<input ng-model="menu[\'菜单1\'][\'mesWebsite\']"/><div ng-bind="menu[\'菜单1\'][\'mesWebsite\']"></div><br>' +
		'子输入框:<input ng-model="mesWebsite"/><div ng-bind="mesWebsite"></div>';
		return {
			scope:true, 
			restrict:'AE',
			template:function(){
				console.log('模板生成');
				return dom;
			}
		}
	}
</script>

原本scope:true,自己改变了就不会反馈给父级,如下图
在这里插入图片描述
初始状态
在这里插入图片描述
更改父值
在这里插入图片描述
更改子值
在这里插入图片描述
上面这个例子一切正常。然后,当使用复杂的json数据进行绑定时,实际上指令作用域并没有生成自己的私有变量。因为引用数据类型还是访问的父级的变量。

如下图
在这里插入图片描述
初始状态
在这里插入图片描述
更改父值,一起变
在这里插入图片描述
更改子值,还是一起变了???

在这里插入图片描述
于是失败了。

还有下面第二层数据也是失败的。

初始状态
在这里插入图片描述
在这里插入图片描述
更改父值
在这里插入图片描述
更改子值,看着一起变呢?
在这里插入图片描述
以上箭头都指向进行操作的输入框。

解释

通过这篇文章:
从 JavaScript 继承说起, 深入理解 Angular Scope 继承关系

我发现,在给子输入框输入的时候相当于给它赋值,赋值的过程就是创建一个自己的变量。

$scope.aa = 'aa';
$scope.bb = 'bb';
$scope.nowItem = {};

和下面常规类型赋值一个道理

let aa = 'aa';
let bb = 'bb';
let nowItem = {};

根据作用域链,自己的作用域有了变量,就不会再访问原型链上的父作用域。
在这里插入图片描述
然而当对象不存在的时候是不能直接给属性赋值的

let nowItem.aa = 'zcxcxcx';      //nowItem不存在,错误

而下面

$scope.nowItem.aa = 'czxcxzv';     //同理失败

这却是个访问的过程。要给nowItem的aa属性赋值,但是自己连nowItem变量都没有,也是因为作用域链,就先向上访问原型链上的父级作用域上的nowItem变量,所以才会导致父级作用域的值随输入同步变化。

如有错误,请指正。我也是个新手,还是摸索的过程,希望尽量把每个知识都理解到位。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值