AngularJS:ng-if | 隐藏(已删除)ng-model变量未从$ scope中删除

Kum*_*hav 3 angularjs

我试图理解ng-if与ng-show的对比.在阅读完文档并在此处查看相关的stackoverflow问题之后,我理解ng-if删除了DOM元素,并且删除了ng-if中的范围变量.在'removed'ng-if元素中的ng-model变量不会出现在$ scope中.

来自Angular ng-if文档: -

请注意,使用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>
Run Code Online (Sandbox Code Playgroud)

这是一个非常简单的用例 - 只有当first大于5时才显示第二个数字输入字段.

保存按钮单击委托控制器中的"保存"功能,它只打印出$ scope的'form'对象.

问题:-

输入1: - 输入x = 6,y = 2输出1:{x:6,y:2}

输入2: - 输入x = 3输出2:{x:3,y:2 }

我无法理解为什么'输出2'仍显示y = 2.如果它的DOM已被删除,那么输出不应该只是{x:3}吗?

如果我想从范围中删除(ngIf-removed)模型,我该怎么办?

谢谢

Mar*_*ine 5

问题

为了进一步了解@Chandermani在评论中指出的内容,ng-if创建了一个新的范围,它有自己的变量.但是,它原型继承自其父作用域,因此如果在现有父对象上设置属性(例如您正在使用的内容)form.y,则在销毁子作用域时,该属性不受影响.

快速解决方案

您可以将另一个指令添加到与您正在设置的元素相同的元素ng-if,该delete属性来自范围$destroy:

指示

myModule.directive('destroyY', function(){
  return function(scope, elem, attrs) {
    scope.$on('$destroy', function(){
      if(scope.form.y) delete scope.form.y;
    }) 
  }
});
Run Code Online (Sandbox Code Playgroud)

视图

<input ... data-ng-if="form.x>5" destroy-y .../>
Run Code Online (Sandbox Code Playgroud)

演示

注意:我看到@ user2334204发布了类似的东西.我决定发布这个,因为这里不需要检查每个摘要的x值