保存后防止Backbone设置验证

时间:2014-08-01 13:52:00

标签: ajax validation backbone.js save set

我试图在Backbone模型上进行客户端验证,该模型涉及对服务器的ajax调用,以确定新条目是否与现有条目重复(通过匹配标题确定)。这是步骤

  1. 检查型号是否是新的。
  2. 如果是新的,请从validate()获取AJAX GET以查看模型是否已存在(按标题)。
  3. 如果响应=重复设置状态无效,如果不继续save()
  4. 我遇到的问题是Backbone正在执行以下操作。

    1. 保存()
    2. validate(): GET返回不重复
    3. 验证通过,set()
    4. validate(): GET返回重复
    5. 我的问题是关于如何防止第二个validate()在集合上触发,因为它触发另一个GET请求并且我得到了错误响应,即使在技术上我已经完成了#34;节省。

      这里要做的就是验证和保存电话

      List = Backbone.Model.extend({
      
      idAttribute: "_id",
      
      urlRoot: '/api/lists',
      ...
      
      validate: function(attrs) {
          // if we are editing don't bother with this (for now)
          if (this.isNew()) {
      
              // see if this title already exists
              var result = '';
      
              $.ajax({
                  url: "/api/lists/" + this.generateTitleKey(attrs.title),
                  type: "GET",
                  async: false,
                  success: function(data){
                      result = data;
                  }
              });
      
              if(result.length > 0) {
                      return {
                          field: "title",
                          errMsg: "You already have this list"
                      };
              }
          }
      }
      });
      
      
      ListView = Backbone.View.extend({
      
      ...
      
      save: function() {
      
          var _self = this;
          var fields = {
              title: _self.$el.find('input[name="new-list-name"]').val()
          }
      
          _self.resetErrors();
      
          _self.model.save(fields, {
              wait: true,
              silent: true,
              success: function(model, res) {
                  if(res.err) {
                      // add UI error
                  } else {
                      new app.View({ model: _self.model });
                      _self.close();
                  }
              },
              error: function(model, res) {
                  console.log('inside error');
              }
          })
      }
      });
      
      app.post('/api/lists', function(req, res){
      
      var list = new ListModel({
          titleKey: generateTitleKey(req.body.title),
          title: req.body.title
      });
      
      return list.save(function(err){
          if(!err) {
              return res.send(list);
          } else {
              return res.status(409).send(JSON.stringify({
                  err: true,
                  errSrc: "list",
                  errType: "insert",
                  errMsg: "That's already a list!"
              }));
          }
      });
      });
      

      无声:真的似乎不适合我,save()和set()都触发validate()。

      我知道有许多方法可以对验证进行错误处理,但我故意尝试使用骨干模型所具有的本机valide方法,并且它的工作效果非常好直到我尝试将其用于ajax电话。我离这儿很近,我可以品尝它。

2 个答案:

答案 0 :(得分:2)

您可以告诉模型不要使用model.set('something', true, { validate: false });验证集合。仅供参考,如果需要,您可以在.save选项哈希中执行相同操作。

你还在设置什么?通常,服务器响应是您要在客户端模型上保存的属性,因此您可以返回所需的内容并避免调用set。

答案 1 :(得分:1)

多米尼克托比亚斯让我得到了正确答案。

isNew()不能用作检查,因为在服务器的响应中,模型在设置之前已经过验证,因此在验证post save()集时,isNew()在技术上仍然是真的。我将对validate()的检查更改为if(attrs._id),一切正常。