Обновление backbone.js против добавления в поле зрения - PullRequest
1 голос
/ 25 января 2012

Мои модели сохраняются и обновляются с использованием обычного 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');
         }}
  });

});

1 Ответ

1 голос
/ 26 января 2012

Что мне нравится делать, так это инициализировать «Вид» с маршрутизатора с «Моделью», если я редактирую, и без «Модели», если я создаю новую «Модель» с нуля. Идея была бы:

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 функцию «success» в представлении (т. Е. Точно так же, как вы определяете submit_form в вашем примере) и добавьте строку кода, где вы связываете модель с этим представлением:

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

Чтобы это работало, вы должны привязать представление к новой функции успеха (именно поэтому вы определяете ее снаружи). Вы можете сделать это в функции инициализации представления следующим образом (больше информации о _bind здесь ):

_.bindAll(this, 'successSaving');

Теперь, в вашем методе 'render' вы можете визуализировать форму и после этого проверить, является ли 'this.model' неопределенным, если нет, теперь вы знаете, что вам нужно заполнить содержимое.

Отказ от ответственности: я не проверял код, поэтому, вероятно, копировальная паста не сработает, но, надеюсь, вы поймете идею.

...