我正在尝试理解ng-if与ng-show的工作原理。
阅读文档并查看相关的stackoverflow问题here后,我了解到ng-if会删除DOM元素和其中的作用域变量。即在“已删除”的ng-if元素中的ng-model变量将不会出现在$scope中。
从Angular ng-if docs可以得知:当使用ngIf删除元素时,其作用域会被销毁,并且当元素恢复时会创建一个新的作用域。在ngIf内部创建的作用域使用原型继承从其父作用域继承。这个重要的含义是如果在ngIf内使用ngModel来绑定到在父作用域中定义的JavaScript基元。
请考虑以下代码片段:
这是一个很简单的用例 - 当第一个数字输入框大于5时,仅显示第二个数字输入框。
保存按钮点击将委托给控制器中的“save”函数,该函数仅打印出$scope的“form”对象。
问题:-
输入1:- 输入x = 6和y = 2 输出1:{x:6,y:2}
输入2:- 输入x = 3 输出2:{x:3,y:2}
我不明白为什么'output 2'仍然显示y = 2。如果它的DOM已被删除,输出不应该只是{x:3}吗?
如果我想从作用域中删除(ngIf-removed)模型,我该怎么办?
谢谢
从Angular ng-if docs可以得知:当使用ngIf删除元素时,其作用域会被销毁,并且当元素恢复时会创建一个新的作用域。在ngIf内部创建的作用域使用原型继承从其父作用域继承。这个重要的含义是如果在ngIf内使用ngModel来绑定到在父作用域中定义的JavaScript基元。
请考虑以下代码片段:
<!doctype html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.10/angular.min.js"></script>
</head>
<body data-ng-app="myModule">
<div data-ng-controller="TestController">
<input name="first" type="number" data-ng-model="form.x" placeholder="Enter Number X"/>
<input name="second" type="number" data-ng-if="form.x>5" data-ng-model="form.y" placeholder="Enter Number Y"/>
<input type="button" value="Click" ng-click="save()"/>
</div>
<script type="text/javascript">
var myModule = angular.module("myModule",[]);
myModule.controller("TestController",function($scope){
$scope.form = {};
$scope.form.x = 0;
$scope.form.y = 0;
$scope.save = function(){
console.log($scope.form);
};
});
</script>
</html>
这是一个很简单的用例 - 当第一个数字输入框大于5时,仅显示第二个数字输入框。
保存按钮点击将委托给控制器中的“save”函数,该函数仅打印出$scope的“form”对象。
问题:-
输入1:- 输入x = 6和y = 2 输出1:{x:6,y:2}
输入2:- 输入x = 3 输出2:{x:3,y:2}
我不明白为什么'output 2'仍然显示y = 2。如果它的DOM已被删除,输出不应该只是{x:3}吗?
如果我想从作用域中删除(ngIf-removed)模型,我该怎么办?
谢谢
$scope.form.y
未被删除。 - Blackholeng-if
会创建一个新的作用域。如果您在该作用域上定义了属性,当该作用域被销毁时,该属性也会被销毁。目前,您的属性是在父级上定义的。 - Chandermaning-click
或ng-change
并添加一个函数,则函数实现中的this
将引用ng-if
作用域。 - Chandermani