2011-11-17 32 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)插件。我想我只是看看如何處理。 –