我有一个总线模型,它有一个嵌套的路由模型。
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}"
}
所以问题是,在保存总线的过程中如何触发嵌套路由的验证?
答案 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插件。它会为你处理很多这样的事情,如果你自己这样做,你很可能会重新编写该插件中已有的代码。