AngularJS更新CRUD表时避免重复(正常添加到表工作)

时间:2016-07-12 13:13:21

标签: javascript angularjs crud

我正在尝试创建一个不允许重复名称的简单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传递给控制器​​是否太有用(除非排序不会更改数据索引)。

2 个答案:

答案 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个错误

  1. 您将联系人传递给unique函数,您应该传递联系人。
  2. 更改

    <强>这样:

    if (isUnqiue(contact, 1)) {
    

    作为

    if (isUnqiue($scope.model.selected, 1)) {
    
    1. 您将$scope.error归属于旧联系人,应该是:
    2. $scope.errorContact = $scope.model.selected;
      

      DEMO

答案 1 :(得分:0)

你应该在客户端上捕获重复错误,但是在服务器上)) 在UserName字段上创建Uniq约束(或主键,如果它不存在)。所以当你尝试put或post重复时,db会抛出错误。您可以捕获它并在某个错误页面上重定向,或者向响应添加错误信息,或者仅显示后端错误。