【问题标题】:Is there a DRY(er) way to add items to an array?是否有一种 DRY(er) 方法可以将项目添加到数组中?
【发布时间】:2014-12-30 22:13:10
【问题描述】:

我有一个可以正常工作的 sn-p 代码。然而,我觉得它的作用有点长,我觉得我重复了很多次自己。这是一个验证 sn-p,它会检查所有输入字段的表单,并在您提交后显示一条错误消息,其中包含您缺少的内容(如果有的话)。

$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
  } 
}

同样,这完美运行,没有错误,看起来很棒的客户端。我只想知道是否有更好/更短/更干的方式来写这篇文章。

【问题讨论】:

  • 也许可以尝试遍历表单元素,而不是为每个元素执行 if。
  • 另一种 DRY(er) 方法是允许指令为您处理此问题,而不是在控制器逻辑中手动添加每个验证,这也是一种非常好的 Angular 做事方式。
  • 类似这样的东西:PLUNKER

标签: javascript angularjs dry


【解决方案1】:

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

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"
);

【讨论】:

    【解决方案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
      } 
    

    【讨论】:

    • 好吧,另一个人删除了他的答案,大声笑,看起来我的想法是正确的,只是输入了一些不必要的代码。谢谢
    【解决方案3】:

    您可以使用所需属性的数组和hasOwnProperty()。大致如下:

    var requiredFields = ['post.title', 'photo', 'post.body', 'post.truncBody'];
    var missingFields = [];
    
    for (field in requiredFields) {
      if (!$scope.hasOwnProperty(field)) {
        missingFields.push(field);
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-20
      • 2011-07-10
      • 1970-01-01
      • 1970-01-01
      • 2021-01-05
      • 1970-01-01
      • 1970-01-01
      • 2015-12-06
      相关资源
      最近更新 更多