如果子模型无效,请防止保存?

时间:2011-11-17 13:08:11

标签: javascript backbone.js

我有一个总线模型,它有一个嵌套的路由模型。

class Busables.Models.Bus extends Backbone.Model
  url: '/buses'
  defaults:
    route: new Busables.Models.Route()

然后我有一个整体错误视图,它监听总线模型的error事件及其路径。

class Busables.Views.Errors extends Backbone.View
  el: '#error-area'
  template: JST['shared/error']

  # model in this instance is a bus
  initialize: ->
    @model.get('route').bind 'error', this.routeError, this
    @model.bind 'error', this.busError, this

因此,当用户在页面上提交表单时,我保存了总线的属性,并将其发送到服务器:

class Busables.Views.NewBus extends Backbone.View
  ...

  saveBus: (event) ->
    event.preventDefault()

    @model.save {
      seats: this.$('#bus_seats').val(),
    }, {
      success: (model, response) ->
        console.log "Success. The model and response: ", model, response
        window.location.href = "/buses/#{response.id}"
    }

所以问题是,在保存总线的过程中如何触发嵌套路由的验证?

1 个答案:

答案 0 :(得分:1)

您需要覆盖总线上的validate方法,并让它调用嵌套路由的验证。

每次更新或保存模型时都会调用validate方法,这样您就有机会阻止无效数据进入模型或返回服务器。如果从validate方法中返回任何非伪造的值,则validate方法将阻止保存或属性更新。

Bus = Backbone.Model.extend({
  validate: function(attrs){
    var invalidBus = false; // do your real bus validation here

    var route = this.get("route");
    var invalidRoute = route.validate(route.toJSON());

    return invalidBus || invalidRoute;
  }
});

Route = Backbone.Model.extend({
  validate: function(attrs){
    // do your route validation here
    // return an 'invalid' status
  }
});

我还建议查看Backbone-Relational插件。它会为你处理很多这样的事情,如果你自己这样做,你很可能会重新编写该插件中已有的代码。