3

我创建了一个非常简单的 Rails & Backbone 应用程序。到目前为止,验证是在 Rails 端执行的。现在我考虑实施骨干验证。我这样做:

  createCampaign: (e) ->
    _this= @
    e.preventDefault()
    attributes =
      info: @getCountries()
      time_start: @$('#start').val()
      time_end: @$('#end').val()
    @collection.create attributes,
      wait: true
      success: ->
        @$('#errors').text('Campaign created!').addClass('correct')
        @$('#create').removeAttr('disabled');
        _this.clearFields('new_campaign')
      error: -> @handleError

wait: true没有任何反应。如果我将其注释掉,则会采取成功的行动。尽管我没有提供有关意图的所需数据。
我的模型和收藏

class SvitlaTest.Models.Campaign extends Backbone.Model
  initialize: ->
    @bind("error", @errorHandling)

  validate: (attrs) ->
    return "Please fill start time of the campaign."  unless attrs.time_start
    return "Please fill end time of the campaign."  unless attrs.time_end
    "Please fill Countrz & language fields."  unless attrs.info
  errorHandling: (model, event) ->
    @$('#create').removeAttr('disabled');
    @$('#errors').html(error)

class SvitlaTest.Collections.Campaigns extends Backbone.Collection
  url: '/api/campaigns'

  model: SvitlaTest.Models.Campaign  

更新 1
我的模板 jst.eco

<form method="post" id="new_campaign" class="corners">
  <p>
    <label for="start" >Start time:</label>
    <input type="text" id="start" name="start" autofocus="" length='30' maxlength='30' />
  </p>
  <p>
    <label for="end" >End time:</label>
    <input type="text" id="end" name="end"  length='30' maxlength='30' />
  </p>
 <div id='country_list'>
 <h4>Info:</h4>
  <p class="country_element">
    Country
    <input type="text" class='country'  id="country" />
    Languages
    <input type="text" class="languages" id="languages" />
  </p>
  </div>
  <p>
    <input type="submit" id="create" value="Create" />
  </p>
</form>

根据您的评论:我正在使用 gems/backbone-on-rails-1.0.0.0
没有输入任何信息
1)wait: true在我运行时处于活动状态
我正在使用 chrome。如果我单击提交按钮(触发 createCampaign),将字段留空,则不会发生任何事情!我正在查看控制台和网络选项卡
2)wait: true注释掉:运行成功回调,然后没有任何反应
输入的信息
在 DB 中创建 有无wait: true新模型


视图初始化中添加的 更新:

initialize: ->
    @collection.on('reset', @render,this)
    @collection.on('add', @appendCampaign ,this)
    @collection.on( "invalid", @handleInvalidState) 
  handleInvalidState: (model, error) ->
    console.log "validation"
    console.log model
    console.log error

如果我注释掉wait: true然后我得到这个控制台输出

validation 
Campaign {cid: "c2", attributes: Object, collection: Campaigns, _changing: false, _previousAttributes: Object…}
Please fill start time of the campaign.   

如果我不评论它什么都不会发生......不知道为什么会发生这种情况

4

1 回答 1

0

在您对 Backbone 模型实施验证之前,您需要了解您在模型中实施的验证方法是如何使用的。骨干验证确保模型不会处于不良状态(包含不良数据)。这意味着如果您尝试在模型上设置任何导致验证失败的数据,则不会发送数据。在这种情况下,会触发“无效”事件。

因此,作为起点,我首先为集合上的“无效”事件添加回调。

@collection.on "invalid", @handleInvalidState

handleInvalidState: (model, error) ->
    // do something with the error.

这至少会告诉您验证是否实际上阻止了请求的发生。

它基于源代码显示,如果模型无法在集合的创建方法中验证,它只会返回 false。这可能就是您没有看到任何事情发生的原因。

希望这可以帮助!

于 2013-04-30T22:17:24.487 回答