我有一个select
中的员工列表,用户可以在其中选择一个员工并编辑其详细信息。然后,他通过一个按钮触发ajax调用,这样服务器就可以更新DB中的记录。
我正在与ngModel
绑定来自员工列表的字段和数据,但是如果在数据库端更新失败就会出现问题,因为我的员工列表是通过双向绑定更新的。
是否有一种方法来初始化我的字段,当用户选择一个元素在选择和更新我的员工列表时,只有当我得到响应?
下面是我的指令(视图)的显式代码:
select(ng-model='selectedEmployee' ng-options="employee.name for employee in employees")
form(role='form')
input(type='input' ng-model='selectedEmployee.userId')
input(type='input' ng-model='selectedEmployee.name')
button (type='button' ng-click='updateEmployee()') update
和指令
app.directive('employeeList', ['employeeServices',
function(employeeServices) {
var employeeListController = function($scope) {
employeeServices.getEmployees()
.success(function(result) {
$scope.employees = result.data
})
.error(function(err) {
})
$scope.selectedEmployee = null
$scope.updateEmployee = function() {
employeeServices.updateEmployee({
userId: $scope.selectedEmployee.userId,
name: $scope.selectedEmployee.name
})
.success(function(data) {
//I want to update my $scope.employees here
})
.error(function(data) {
//Otherwise I show some error message
})
.then(function() {
$scope.selectedEmployee = {}
})
}
}
return {
...
controller: employeeListController
}
}
])
<<p> 解决方案/strong> 所以为了解决这个问题,我使用angular.copy
和ng-change
。我已经添加了ng-change
的选择,在那里我复制了selectedEmployee
到selectedEmployeeDirty
,我提供了模型为我的形式。然后在服务的回调中,我更新了selectedEmployee
。
非常简单。对象在javascript中是通过"引用"共享的。实际上,这是一个C指针-或者类似的东西-如何共享对象的内存位置。如果你这样做:
var a = {},
b = a;
a.toto = true;
console.log(b);
你会看到
b = { toto: true }
记住这一点。
现在,我们如何在不更新原始对象的情况下隔离编辑对象?复制一份!角。Copy是友元,它会将SRC的每个属性复制到dst。
像以前一样使用ng-model,保存更改,并且只在回调时更新原始模型:-)