这可能更像是一个围绕设计模式的问题 - 我希望它有意义。
我正在使用骨干 - 正在开发一个相对简单的应用程序,用户可以在其中添加请求(请求模型只是标题,描述和价格)。添加请求的唯一要求是用户“已登录”。
但是我希望用户在检查用户是否登录之前“添加”请求(删除一个屏障)。我的意思是用户填写表单,如果没有注册,他们必须注册,然后请求只是发送,如果他们登录它只会被发送。因此,最初会呈现“添加请求”视图,当触发保存时,这将调用模型上的保存,该模型在服务器上调用ajax请求。响应将返回true(用户已登录并添加请求)或false(用户未登录)。
因此,假设用户未登录 - 那么我希望呈现一个新视图'register',其中包含用户切换到'login'的选项(另一个视图)。所以理论上的用户可以来自
Request (save) -> Register -> Login -> Request (save)
假设用户随后注册(填写表格然后调用寄存器视图保存方法,然后调用寄存器模型保存并返回确定)。我希望再次再次调用'request'保存方法(现在用户将登录)。但是我不希望注册/登录绑定到请求视图 - 理论上新的视图(假设我有一个已发送的消息视图)将需要类似的功能,例如尝试发出请求,如果失败的开关视图注册 - 执行保存然后调用一些回调。
所以问题是这样做的正确方法是什么?
1)我是否在引用“save”函数的请求视图中创建了一些闭包,并将其存储在全局中以通过register / login onsuccess调用? 2)如上所述创建一个闭包并将其传递给寄存器等(如果是这样,我将如何传递给定的寄存器/登录是一个视图)。 3)传递对请求视图的'this'的引用?
到目前为止,我所拥有的只是,所以在其他方面,我会渲染'注册'视图,但是如果没有它变得非常难看,我想知道最好的方法吗?
save : function(event){
if(this.model.isValid() == true) {
this.$("#general_error").hide();
this.model.set({'formattedPrice' : TB_H.formatPrice(this.model.get('currency'), this.model.get('price'))});
self = this;
this.model.save(this.model.toJSON(), {
success: function(m, y) {
if(y.status == true) {
self.model = new TB_BB.Request();
Backbone.ModelBinding.bind(self);
Backbone.Validation.bind(self);
$('#add-offer-button').show();
} else {
if(y.errors[0] == 'not logged in') {
this.$("#general_error").html('You are not logged in');
this.$("#general_error").show();
} else {
_.each(y.errors, function(key, val) { this.$("#general_error").html(key) });
this.$("#general_error").show();
}
}
}, error : function(m,y) {
this.$("#general_error").show();
this.$("#general_error").html("Something bad happened - please try again")
}
}
);
}
非常感谢任何帮助!
答案 0 :(得分:0)
在问了一个我刚删除的类似问题后,我注意到了这一点。我认为这不是大多数人在骨干中做这件事的方式。
我做的是将不同的路由传递给相同的方法,如果id不为null,我会调用该路由。
所以我有一个观点
base_view = Backbone.Views.extend({ initialize: function(id,a_id,b_id){ this.id = id; this.a_id = a_id; this.b_id = b_id; Myapp.data = new Myapp.Model.Base(); Myapp.data.url = '/data_url/'+id; Myapp.data.fetch(Myapp.data, { success: function(response){ // i have some nested collections, and models so i fill those in here Myapp.mainModel = new First_Child_Collection(response.attributes.first_child_array); }, error: function(){ alert('oops couldn't get data'); } }); Myapp.data.bind("fetched",this.render,this); }, render: function(){ new Main_View(); new Sub_View_1(this.id); new Sub_View_2(this.a_id); new Sub_View_3(this.b_id); } });
然后在我的路线中,我没有为每个路线设置新路线,而是
routes: { "app/new": "new", "app/:id/edit/a/:a_id/b/:b_id": "edit" } edit { new base_view(id,a_id,b_id); }
我不确定这是否完美,但我认为它比其他选项更干净。我只是在传递这些视图之前检查a_id或b_id是否未定义。
希望它有所帮助。