backbone.js更新vs在视图中添加

时间:2012-01-24 20:49:19

标签: view model backbone.js

我使用常规savesuccess回调来保存和更新模型。

但是我试图找出如何定义单独的add视图,具体取决于模型是新的还是对现有模型的更新。

这不是服务器端。我有服务器创建/更新工作正常,我正在试图找出更新视图的“正确”方法。

我的代码很简单

Myapp.FormInput = Backbone.Views.extend({

  initialize: function(){...

 },

 submit_form: function(){
     if(this.id===undefined){
          // this is a new model, so create it
       model.set(new Myapp.Model.set(Myapp.Models.Helpers.serialize_objects(form)));
       model.set({parent_id:parent.id});
     } else {
        // this is an update to an existing model, so just update the model
      model.set(Myapp.Model.set(Myapp.Models.Helpers.serialize_objects(form)));
      model.url+='/'+this.id;
     }

    model.save(model,
            {success: function(model){
               Myapp.Collection.add(model);
             }, error: function(){
             alert('error creating or updating');
         }}
  });

});

1 个答案:

答案 0 :(得分:1)

我喜欢做的是使用'Model'从路由器初始化'View',如果我正在编辑,并且没有'Model',如果我从头开始创建一个新的'Model'。 这个想法是:

var Workspace = Backbone.Router.extend({

    routes: { '/collection/:id'         : 'edit_model',
          '/collection/newObject'   : 'new_model
    },

    new_model : function(){

        myView = new A_View();
    },

    edit_model : function(){

        myView = new A_View({model:aModel});
    }
});

然后,在'render'方法中,检查此视图实例中的模型。

但是..这仅适用于您的应用程序使用不同的路径进行编辑和创建模型的情况。也许你是以最精细的方式在同一条路线上做所有事情(或者你有其他原因)。

您可以尝试这样的事情:

在视图中定义model.save'成功'功能(即,与您在示例中定义submit_form的方式相同),并添加一个代码行,将模型与此视图关联:

successSaving : function( model ){
    Myapp.Collection.add( model );
    this.model = model;  //here you save the model in your view.
}

为了使其正常工作,您必须将视图绑定到新的成功函数(这是您在外部定义它的原因)。 您可以在视图初始化函数中进行此操作(有关'_bind'here的更多信息):

_.bindAll(this, 'successSaving');

现在,在“渲染”方法中,您可以渲染表单,然后检查“this.model”是否为“未定义”,如果不是,则您现在知道必须填写内容

免责声明:我没有检查过代码,因此复制粘贴可能无法正常工作,但希望您能够理解。