View backbone.js更新与加载项视图

View backbone.js更新与加载项视图,view,model,backbone.js,View,Model,Backbone.js,我使用常规的save和success回调来保存和更新模型 但我正试图找出如何定义一个单独的add视图,这取决于模型是新的还是对现有模型的更新 这不是服务器端。我让服务器创建/更新工作正常,我正在尝试找出更新视图的“正确”方法 我的代码很简单 Myapp.FormInput = Backbone.Views.extend({ initialize: function(){... }, submit_form: function(){ if(this.id===undefin

我使用常规的
save
success
回调来保存和更新模型

但我正试图找出如何定义一个单独的
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'); }} }); }); Myapp.FormInput=Backbone.Views.extend({ 初始化:函数(){。。。 }, 提交表单:函数(){ if(this.id==未定义){ //这是一个新模型,所以创建它 set(新的Myapp.model.set(Myapp.Models.Helpers.serialize_对象(表单)); set({parent\u id:parent.id}); }否则{ //这是对现有模型的更新,因此只需更新模型即可 model.set(Myapp.model.set(Myapp.Models.Helpers.serialize_对象(表单)); model.url+='/'+this.id; } model.save(model, {成功:功能(模型){ Myapp.Collection.add(模型); },错误:函数(){ 警报(“创建或更新错误”); }} }); });
如果我正在编辑,我喜欢使用“模型”从路由器初始化“视图”,如果我从头开始创建新的“模型”,则不使用“模型”。 其想法是:

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”方法中,检查此视图实例中的模型

但是。。这仅在应用程序使用不同的路径编辑和创建模型时有效。也许你正在以一种最精细的方式在同一条路线上做每件事(或者你有其他原因)

您可以尝试以下方法:

定义您的
模型。在视图中保存
“success”函数(即,与您在示例中定义提交表单的方式相同),并在其中添加代码行,将模型与此视图关联:

successSaving : function( model ){
    Myapp.Collection.add( model );
    this.model = model;  //here you save the model in your view.
}
为了使其工作,您必须将视图绑定到新的success函数(这就是您在外部定义它的原因)。 您可以在view initialize函数中这样做(有关“\u bind”的更多信息):

现在,在“render”方法中,您可以呈现表单,然后检查“
this.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”方法中,检查此视图实例中的模型

但是。。这仅在应用程序使用不同的路径编辑和创建模型时有效。也许你正在以一种最精细的方式在同一条路线上做每件事(或者你有其他原因)

您可以尝试以下方法:

定义您的
模型。在视图中保存
“success”函数(即,与您在示例中定义提交表单的方式相同),并在其中添加代码行,将模型与此视图关联:

successSaving : function( model ){
    Myapp.Collection.add( model );
    this.model = model;  //here you save the model in your view.
}
为了使其工作,您必须将视图绑定到新的success函数(这就是您在外部定义它的原因)。 您可以在view initialize函数中这样做(有关“\u bind”的更多信息):

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


免责声明:我还没有检查代码,所以复制粘贴可能不起作用,但希望您能理解。

谢谢Robert,我最后做了一些类似于您昨天在这里所说的事情。我现在的做法是在模型上使用bind方法。一个用于保存,一个用于更新。成功的结果实际上是空的。我认为你的方式是一个很长的路要说,所以我给了你胜利!谢谢你,罗伯特,我最后做了一些和你昨天在这里说的相似的事情。我现在的做法是在模型上使用bind方法。一个用于保存,一个用于更新。成功的结果实际上是空的。我认为你的方式是一个很长的路要说,所以我给了你胜利!