AngularJS不会使用ng-click设置范围变量

时间:2017-08-16 20:03:29

标签: angularjs bootstrap-modal

我想要的是在打开模态之前设置范围change 所以我将ng-click="change = false;mode = 'edit';"放在编辑按钮

错误的情况是,当我点击编辑时,范围应为false 但如果我通过按更改按钮将其更改为true,然后我关闭模态并再次单击编辑以再次打开模态,您可以看到范围仍然为真,同时应将其重置为false

有任何解释吗?

我在Plunker

中提出了这个例子

以下是代码:

<!DOCTYPE html>
<html ng-app="app">

<head>
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js"></script>
  <script>
    var app = angular.module('app', []);
    app.controller('MainCtrl', function($scope) {
    });
  </script>
</head>

<body ng-controller="MainCtrl">
  <button type="button" class="btn btn-info btn-lg" data-toggle="modal" data-target="#myModal" ng-click="mode = 'add'">Add</button>
  <button type="button" class="btn btn-info btn-lg" data-toggle="modal" data-target="#myModal" ng-click="change = false;mode = 'edit';">Edit</button>
  <!-- Modal -->
  <div class="modal fade" id="myModal" role="dialog" ng-switch on="mode">
    <div class="modal-dialog">

      <!-- Modal content-->
      <div class="modal-content">
        <div class="modal-header">
          <button type="button" class="close" data-dismiss="modal">&times;</button>
          <h4 class="modal-title" ng-switch-when="add">Add</h4>
          <h4 class="modal-title" ng-switch-when="edit">Edit</h4>
        </div>
        <div class="modal-body">
          <p>{{mode}} </p>
          <button type="button" class="btn btn-default" ng-click="change = false" ng-show="change">Change</button>
          <button type="button" class="btn btn-default" ng-click="change = true" ng-show="!change">Revert</button>
          <p>{{change}} </p>
        </div>
        <div class="modal-footer">
          <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
        </div>
      </div>

    </div>
  </div>
</body>

</html>

1 个答案:

答案 0 :(得分:1)

这是因为angular在创建非隔离范围时使用原型继承。由于ng-repeat / ng-if / ng-if这些模板指令创建了原型继承的子范围,同时在其中呈现了被转换的DOM。值得一读What are the nuances of scope prototypal / prototypical inheritance in AngularJS?。这类问题通常发生在stringboolnumber等基本数据类型上。解决此问题的一般做法是使用object(引用类型)。在角度范围内定义模型时使用引用类型,称为Dot Rule

在您的方案中,您可以考虑创建$scope.model = {}对象,该对象最终会保存与该实体相关的所有属性。在HTML上使用它们时使用model.change&amp; model.edit

在定义控制器时甚至可以使用controllerAs语法,它将所有绑定变量绑定到this(上下文)而不是$scope

Demo Plunker