我想要的是在打开模态之前设置范围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">×</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>
答案 0 :(得分:1)
这是因为angular在创建非隔离范围时使用原型继承。由于ng-repeat
/ ng-if
/ ng-if
这些模板指令创建了原型继承的子范围,同时在其中呈现了被转换的DOM。值得一读What are the nuances of scope prototypal / prototypical inheritance in AngularJS?。这类问题通常发生在string
,bool
,number
等基本数据类型上。解决此问题的一般做法是使用object
(引用类型)。在角度范围内定义模型时使用引用类型,称为Dot Rule
。
在您的方案中,您可以考虑创建$scope.model = {}
对象,该对象最终会保存与该实体相关的所有属性。在HTML上使用它们时使用model.change
&amp; model.edit
。
在定义控制器时甚至可以使用controllerAs
语法,它将所有绑定变量绑定到this
(上下文)而不是$scope
。