是否有DRY(呃)方法将项添加到数组中?

时间:2014-12-30 22:13:10

标签: javascript angularjs dry

我有一段代码可以正常运行。但是,我觉得这样做有点长,我觉得我很重复自己。这是一个验证代码段,用于检查所有输入字段的表单,并在您提交后显示错误消息(如果有)。

$scope.save = function() {
  var post = new FormData();
  post.append("title", $scope.post.title);
  post.append("photo", $scope.photo);
  post.append("body", $scope.post.body);
  post.append("truncBody", $scope.post.truncBody);

  if(!$scope.post.title || !$scope.photo || !$scope.post.body || !$scope.post.truncBody){
    var thingsLeft= [];
    if(!$scope.post.title){
      thingsLeft.push(" Title");
    }
    if(!$scope.photo){
      thingsLeft.push(" Cover Image")
    }
    if(!$scope.post.body){
      thingsLeft.push(" Body");
    }
    if(!$scope.post.truncBody){
      thingsLeft.push(" Summary");
    }

    Messages.error("Please fill out all fields. Fields left:" + thingsLeft);
    return;
  }else{
    post to server
  } 
}

再次,这完美,没有错误,看起来很棒的客户端。我想知道的是,如果有更好/更短/更干的方式来写这个。

3 个答案:

答案 0 :(得分:3)

如果你真的最终拥有了很多这样的代码,你可以写一个辅助函数:

function pushIf(array) {
  for (var i = 1; i < arguments.length; i += 2)
    if (arguments[i]) array.push(arguments[i + 1]);
}

然后

pushIf(thingsLeft,
  !$scope.post.title, " Title ",
  !$scope.photo, " Cover Image ",
  !$scope.post.body, " Body",
  !$scope.post.truncBody, " Summary"
);

答案 1 :(得分:2)

如果thingsLeft为空,没有剩下的东西,你可以省略if中列出的双重道具,这会让我个人烦恼:

  var thingsLeft= [];
  if(!$scope.post.title){
     thingsLeft.push(" Title");
  }
  if(!$scope.photo){
     thingsLeft.push(" Cover Image")
  }
  if(!$scope.post.body){
     thingsLeft.push(" Body");
  }
  if(!$scope.post.truncBody){
     thingsLeft.push(" Summary");
  }

  if ( thingsLeft.length > 0 ) {
    Messages.error("Please fill out all fields. Fields left:" + thingsLeft);
    return;
  }else{
    post to server
  } 

答案 2 :(得分:0)

您可以使用所需属性的数组和hasOwnProperty()。这些方面的东西:

var requiredFields = ['post.title', 'photo', 'post.body', 'post.truncBody'];
var missingFields = [];

for (field in requiredFields) {
  if (!$scope.hasOwnProperty(field)) {
    missingFields.push(field);
  }
}