2011-11-17 50 views
1

我有一个巴士模型,它有一个嵌套的路线模型。如果子模型无效,防止保存?

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

您需要覆盖公交车上的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插件。它为你处理了很多这种情况,如果你自己这样做,你很可能会重新编写已经在该插件中可用的代码。

+0

是的。我认为这将是前进的方向。问题是我已经相当广泛地使用了[Backbone Validations](https://github.com/n-time/backbone.validations)插件。我想我只是看看如何处理。 –