Angular 在 ng-click 函数中还原对象值
Angular object value being reverted in ng-click function
我有一个任务对象数组,使用 ng-repeat 指令显示在我的视图中。每个对象都有一个名为 "editMode" 的布尔值 属性,默认情况下设置为 false。我有一个 ng-click 函数,可以将当前任务的 "editMode" 属性 更改为 true。在我看来,我有一些元素 shown/hidden 使用 ng-show 和 editMode 属性。这按预期工作。我有一个在 editMode 为真时显示的保存按钮。 Save 按钮调用一个函数,将当前任务的 "editMode" 属性 设置为 false。当我在函数中放置调试器时,我看到 属性 变为 false,但随后又恢复为 true。下面列出了我的代码的相关部分:
<ul class="list-group">
<li ng-repeat="pt in vm.projectTasks" class="list-group-item"
ng-click="vm.expandTask(pt)">
<span ng-show="!pt.editMode">{{pt.title}}</span>
<div ng-show="pt.editMode">
<label class="control-label">Task Name</label>
<input class="form-control" ng-model="pt.title" type="text"/>
<label class="control-label">Hours</label>
<input class="form-control" type="number" ng-model="pt.hours"/>
<button type="button" ng-click="vm.saveTask(pt)">Save</button>
</div>
<span ng-show="!pt.editMode" class="pull-right"></span>
<button class="btn btn-danger" ng-click="vm.deleteTask(pt)">
<i class="fa fa-trash" aria-hidden="true"></i>
</button>
</span>
</li>
</ul>
.controller('newProjectCtrl',function($uibModalInstance){
var vm = this;
vm.existingClient = true;
vm.projectTeamMembers;
vm.projectTasks =[
{title:'Design', hours:0, editMode:false},
{title:'Development', hours:0, editMode:false},
{title:'UAT', hours:0, editMode:false}
];
vm.expandTask = function(pt){
pt.editMode = true;
}
vm.saveTask = function(pt){
pt.editMode = false;
}
vm.deleteTask = function(pt){
var i = vm.projectTasks.indexOf(pt);
if(i != -1){
vm.projectTasks.splice(i,1);
}
}
这是因为由于传播,它还会触发父 li
标签的点击。
更改模板以也传递事件:
ng-click="vm.saveTask($event, pt)"
然后更改saveTask
停止传播:
vm.saveTask(event, pt){
pt.editMode = false;
event.stopPropagation();
}
我有一个任务对象数组,使用 ng-repeat 指令显示在我的视图中。每个对象都有一个名为 "editMode" 的布尔值 属性,默认情况下设置为 false。我有一个 ng-click 函数,可以将当前任务的 "editMode" 属性 更改为 true。在我看来,我有一些元素 shown/hidden 使用 ng-show 和 editMode 属性。这按预期工作。我有一个在 editMode 为真时显示的保存按钮。 Save 按钮调用一个函数,将当前任务的 "editMode" 属性 设置为 false。当我在函数中放置调试器时,我看到 属性 变为 false,但随后又恢复为 true。下面列出了我的代码的相关部分:
<ul class="list-group">
<li ng-repeat="pt in vm.projectTasks" class="list-group-item"
ng-click="vm.expandTask(pt)">
<span ng-show="!pt.editMode">{{pt.title}}</span>
<div ng-show="pt.editMode">
<label class="control-label">Task Name</label>
<input class="form-control" ng-model="pt.title" type="text"/>
<label class="control-label">Hours</label>
<input class="form-control" type="number" ng-model="pt.hours"/>
<button type="button" ng-click="vm.saveTask(pt)">Save</button>
</div>
<span ng-show="!pt.editMode" class="pull-right"></span>
<button class="btn btn-danger" ng-click="vm.deleteTask(pt)">
<i class="fa fa-trash" aria-hidden="true"></i>
</button>
</span>
</li>
</ul>
.controller('newProjectCtrl',function($uibModalInstance){
var vm = this;
vm.existingClient = true;
vm.projectTeamMembers;
vm.projectTasks =[
{title:'Design', hours:0, editMode:false},
{title:'Development', hours:0, editMode:false},
{title:'UAT', hours:0, editMode:false}
];
vm.expandTask = function(pt){
pt.editMode = true;
}
vm.saveTask = function(pt){
pt.editMode = false;
}
vm.deleteTask = function(pt){
var i = vm.projectTasks.indexOf(pt);
if(i != -1){
vm.projectTasks.splice(i,1);
}
}
这是因为由于传播,它还会触发父 li
标签的点击。
更改模板以也传递事件:
ng-click="vm.saveTask($event, pt)"
然后更改saveTask
停止传播:
vm.saveTask(event, pt){
pt.editMode = false;
event.stopPropagation();
}