视图中的回调

时间:2012-01-18 19:09:14

标签: backbone.js

这可能更像是一个围绕设计模式的问题 - 我希望它有意义。

我正在使用骨干 - 正在开发一个相对简单的应用程序,用户可以在其中添加请求(请求模型只是标题,描述和价格)。添加请求的唯一要求是用户“已登录”。

但是我希望用户在检查用户是否登录之前“添加”请求(删除一个屏障)。我的意思是用户填写表单,如果没有注册,他们必须注册,然后请求只是发送,如果他们登录它只会被发送。因此,最初会呈现“添加请求”视图,当触发保存时,这将调用模型上的保存,该模型在服务器上调用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")
                }
            }
        );

    } 

非常感谢任何帮助!

1 个答案:

答案 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是否未定义。

希望它有所帮助。