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

Prevent saving if child model is invalid?

本文关键字:保存 模型 无效 如果      更新时间:2023-09-26

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

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

那么问题是,当我保存总线时,如何触发嵌套路由的验证?

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

validate方法被称为任何时候你的模型更新或被保存,给你一个机会,以防止无效的数据使它的方式进入你的模型或返回到服务器。如果您从validate方法返回的任何值不是false,那么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插件。它为你处理了很多这样的事情,如果你自己这样做,你很有可能会重写插件中已经可用的代码。