AngularJS - ng-model 没有正确更新
AngularJS - ng-model not updating correctly
我有这张HTML:
:
:
<td ng-if="Curr_State == 'Edit' && This_Page.Data_Changed == false" style="max-width:300px">
<button type="button"
class="FD"
ng-click="Initiate_Append_to_JobCard()"
style="height:80px;width:180px;white-space:normal;background:green;padding:10px">
<font size="3" class="ng-binding">Append{{All_Labels.Common.Append}}
</font>
<font size="2">
{{This_Page.Append_Get_Number}}
<table id="Get_Append_Count_an_Execute" ng-if="This_Page.Append_Get_Number == 'Y'">
<tbody>
<tr>
<td>
<label for="Append_Number"> #:</label>
</td>
<td>
<input string-to-number
id="Append_Number"
type="number"
class="form-control"
ng-model="This_Page.Append_Number"
min="0"
step="1"
style="width:70px;margin:0px">
</td>
<td>
<button class="btn btn-success"
ng-click="Do_Append()"
title="Proceed with Append"
type="button">
<font size="2" color="white">
<span class="glyphicon glyphicon-ok" aria-hidden="true"></span>
</font>
</button>
</td>
<td>
<button class="btn btn-danger"
ng-click="Cancel_Append()"
title="Cancel Append request"
type="button">
<font size="2" color="white">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</font>
</button>
</td>
</tr>
</tbody>
</table>
</font>
</button>
</td>
:
:
以及控制器中的以下两个函数:
$scope.Initiate_Append_to_JobCard = function() {
$scope.This_Page.Append_Get_Number = "Y" ;
}
//////////////////////////////////////////////////////////////////
$scope.Cancel_Append = function() {
$scope.This_Page.Append_Get_Number = "N" ;
$scope.This_Page.Append_Number = null ;
}
单击外部按钮时,$scope.This_Page.Append_Get_Number
设置为 "Y"
并且正确显示内部对象。
单击取消按钮时,调用函数 $scope.Cancel_Append
,$scope.This_Page.Append_Get_Number
的值设置为 "N"
(函数的第一条语句),但此更改不是向 HTML 传播。事实上,我添加了{{This_Page.Append_Get_Number}}
,最初显示N
,然后是Y
,然后无论我点击取消按钮多少次,它都保持不变。
使用 ng-show 代替 ng-if
<td ng-show="Curr_State == 'Edit' && This_Page.Data_Changed == false" style="max-width:300px">
<button type="button"
class="FD"
ng-click="Initiate_Append_to_JobCard()"
style="height:80px;width:180px;white-space:normal;background:green;padding:10px">
<font size="3" class="ng-binding">Append{{All_Labels.Common.Append}}
</font>
<font size="2">
{{This_Page.Append_Get_Number}} </font></button>
<table id="Get_Append_Count_an_Execute" ng-if="This_Page.Append_Get_Number == 'Y'">
如果 table 应该在按钮本身内部,则取消按钮上的单击事件将冒泡到附加按钮,该按钮将关闭并再次打开。
您需要添加一个
event.stopPropagation()
在您的取消函数中,并将 $event 传递给该函数
更新了 Plunker
https://embed.plnkr.co/CEHNggASaVGqkqfamdEx/
事件冒泡
当你在另一个元素中有一个元素,并且最里面的元素发生了一个事件(这里是点击事件),然后该事件由该元素处理,然后向上传递到 DOM 层次结构所有具有该事件侦听器并由每个事件处理的祖先元素。
这里有一个按钮内嵌一个按钮,两个按钮都有点击事件侦听器。单击内部按钮 (Cancel) 时,侦听器 (Cancel_Append) 处理事件(将值更改为 N),然后将单击传递给 parent/outer 按钮,侦听器 (Initiate_Append_to_JobCard) 处理事件并再次将值更改为 Y。
由于这些几乎是同时发生的,所以我们看不出区别。两个函数都加一个'console.log($scope.This_Page.Append_Get_Number)'就可以看出。
为了防止事件冒泡,我们需要在处理完事件后取消传播。所以我们需要从HTML传递$event对象,然后在"Cancel_Append"处理完事件后,我们需要停止向上传播事件DOM 使用 event.stopPropagation().
看看这个link 以更好地理解事件冒泡
What is event bubbling and capturing?
我有这张HTML:
:
:
<td ng-if="Curr_State == 'Edit' && This_Page.Data_Changed == false" style="max-width:300px">
<button type="button"
class="FD"
ng-click="Initiate_Append_to_JobCard()"
style="height:80px;width:180px;white-space:normal;background:green;padding:10px">
<font size="3" class="ng-binding">Append{{All_Labels.Common.Append}}
</font>
<font size="2">
{{This_Page.Append_Get_Number}}
<table id="Get_Append_Count_an_Execute" ng-if="This_Page.Append_Get_Number == 'Y'">
<tbody>
<tr>
<td>
<label for="Append_Number"> #:</label>
</td>
<td>
<input string-to-number
id="Append_Number"
type="number"
class="form-control"
ng-model="This_Page.Append_Number"
min="0"
step="1"
style="width:70px;margin:0px">
</td>
<td>
<button class="btn btn-success"
ng-click="Do_Append()"
title="Proceed with Append"
type="button">
<font size="2" color="white">
<span class="glyphicon glyphicon-ok" aria-hidden="true"></span>
</font>
</button>
</td>
<td>
<button class="btn btn-danger"
ng-click="Cancel_Append()"
title="Cancel Append request"
type="button">
<font size="2" color="white">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</font>
</button>
</td>
</tr>
</tbody>
</table>
</font>
</button>
</td>
:
:
以及控制器中的以下两个函数:
$scope.Initiate_Append_to_JobCard = function() {
$scope.This_Page.Append_Get_Number = "Y" ;
}
//////////////////////////////////////////////////////////////////
$scope.Cancel_Append = function() {
$scope.This_Page.Append_Get_Number = "N" ;
$scope.This_Page.Append_Number = null ;
}
单击外部按钮时,$scope.This_Page.Append_Get_Number
设置为 "Y"
并且正确显示内部对象。
单击取消按钮时,调用函数 $scope.Cancel_Append
,$scope.This_Page.Append_Get_Number
的值设置为 "N"
(函数的第一条语句),但此更改不是向 HTML 传播。事实上,我添加了{{This_Page.Append_Get_Number}}
,最初显示N
,然后是Y
,然后无论我点击取消按钮多少次,它都保持不变。
使用 ng-show 代替 ng-if
<td ng-show="Curr_State == 'Edit' && This_Page.Data_Changed == false" style="max-width:300px">
<button type="button"
class="FD"
ng-click="Initiate_Append_to_JobCard()"
style="height:80px;width:180px;white-space:normal;background:green;padding:10px">
<font size="3" class="ng-binding">Append{{All_Labels.Common.Append}}
</font>
<font size="2">
{{This_Page.Append_Get_Number}} </font></button>
<table id="Get_Append_Count_an_Execute" ng-if="This_Page.Append_Get_Number == 'Y'">
如果 table 应该在按钮本身内部,则取消按钮上的单击事件将冒泡到附加按钮,该按钮将关闭并再次打开。
您需要添加一个
event.stopPropagation()
在您的取消函数中,并将 $event 传递给该函数
更新了 Plunker
https://embed.plnkr.co/CEHNggASaVGqkqfamdEx/
事件冒泡
当你在另一个元素中有一个元素,并且最里面的元素发生了一个事件(这里是点击事件),然后该事件由该元素处理,然后向上传递到 DOM 层次结构所有具有该事件侦听器并由每个事件处理的祖先元素。
这里有一个按钮内嵌一个按钮,两个按钮都有点击事件侦听器。单击内部按钮 (Cancel) 时,侦听器 (Cancel_Append) 处理事件(将值更改为 N),然后将单击传递给 parent/outer 按钮,侦听器 (Initiate_Append_to_JobCard) 处理事件并再次将值更改为 Y。
由于这些几乎是同时发生的,所以我们看不出区别。两个函数都加一个'console.log($scope.This_Page.Append_Get_Number)'就可以看出。
为了防止事件冒泡,我们需要在处理完事件后取消传播。所以我们需要从HTML传递$event对象,然后在"Cancel_Append"处理完事件后,我们需要停止向上传播事件DOM 使用 event.stopPropagation().
看看这个link 以更好地理解事件冒泡
What is event bubbling and capturing?