我正在尝试创建一个不允许重复名称的简单CRUD表。 在向表中添加联系人时,我能够使副本工作,但在更新表时它似乎不起作用。
以下是我验证联系人唯一性的简单功能:
// (allowed) dupCount is 0 when adding, and 1 when in update
// mode to allow saving the contact without making any changed.
var isUnqiue = function(newContact, dupCount) {
var returnVal = true;
var count = 0;
for (var contact in $scope.model.contacts) {
if (newContact.name.toUpperCase() === $scope.model.contacts[contact].name.toUpperCase()) {
count++;
}
}
if (count > dupCount) {
returnVal = false;
}
return returnVal;
}
出于某种原因,更新模式下的副本根本不起作用!即使我将3个或4个联系人更新为相同名称,也可以使用' if(count> dupCount)...'声明似乎总是比较1和1.
这是一个包含整个代码的JSFiddle:https://jsfiddle.net/7ay9nsLv/
简单方案:
Add 'Adam, Smith'
1. Edit 'Adam, Smith', Save without Changing > Good
2. Add 'Adam, Smith' again > Duplicate Error
Add 'Adam, SmithX'
3. Edit 'Adam, SmithX' to 'Adam, Smith' > Duplicate Error
另请注意,表中的数据可以进行排序,因此不确定将$ index传递给控制器是否太有用(除非排序不会更改数据索引)。
答案 0 :(得分:1)
首先,您在for-loop
中执行 redudant 操作,只需使用Array.prototype.forEach()方法查找索引是否存在:
// Use named function to stop looping correctly
var indexExists = -1;
$scope.model.contacts.forEach(function loop(contact, index) {
if (loop.stop) {
return;
}
if (contact.name.toUpperCase() === newContact.name.toUpperCase()) {
indexExists = index;
loop.stop = true;
}
});
或使用 ES6:
var indexExists = $scope.model.contacts.findIndex(function(contact) {
return contact.name.toUpperCase() === newContact.name.toUpperCase();
});
甚至使用下划线的findIndex方法:
_.findIndex($scope.model.contacts, function(contact) { return contact.name.toUpperCase() === newName });
然后只需检查:
return indexExists == -1 && indexExists !== idx || indexExists === idx && $scope.model.contacts[indexExists].name.toUpperCase() === newName;
只有当用户不存在或者它存在且它正在编辑时,它才会返回true。
现在,让我们转到错误:
你犯了2个错误:
unique
函数,您应该传递新联系人。 更改
<强>这样:强>
if (isUnqiue(contact, 1)) {
作为强>
if (isUnqiue($scope.model.selected, 1)) {
$scope.error
归属于旧联系人,应该是:$scope.errorContact = $scope.model.selected;
的 DEMO 强>
答案 1 :(得分:0)
你应该在客户端上捕获重复错误,但是在服务器上)) 在UserName字段上创建Uniq约束(或主键,如果它不存在)。所以当你尝试put或post重复时,db会抛出错误。您可以捕获它并在某个错误页面上重定向,或者向响应添加错误信息,或者仅显示后端错误。