Backbone.View: удаление разных представлений, связанных с разными моделями.

Мне нужно отобразить three different views, которые связаны с three different model или коллекциями.
Чтобы выполнить эту задачу, я написал следующий код. (*)
Скажите, пожалуйста, правильно ли это сделать, в любом случае это работает.

Вот моя проблема.
В одном из этих представлений, скажем, firstView, можно выполнить DELETE request на сервере, который позаботится об удалении всех данных, связанных с этим three view.

Теперь мне нужно удалить три моих представления... но из firstView я не могу получить доступ к двум другим представлениям.

1) Как я могу выполнить эту задачу?
2) Должен ли я перепроектировать/улучшить свою реализацию?


(*)

// module for display three different views

define([
    "js/views/01View",
    "js/views/02View",
    "js/views/03View"
], function (FirstView, SecondView, ThirdView) {

    var MainView = Backbone.View.extend({

        initialize: function ()
        {
            this.render();
        },

        render: function ()
        {
            var movie_id = this.options.movie_id;
            this.firstView = new FirstView(movie_id);
            this.secondView = new SecondView(movie_id);
            this.thirdView = new ThirdView(movie_id);
        }
    });    

    return MainView;
});

P.S.:

_id используется для создания параметра URL коллекций или моделей.

url1: http://localhost/movie/movie_id   (model1)
url2: http://localhost/movie/movie_id/followers   (collection2)
ulrs: http://localhost/movie/movie_id/feeds (collection3)

Когда я удаляю модель1, представления2 и представления3, связанные с коллекциями2 и коллекция3, должны быть удалены.


person underscore666    schedule 15.05.2012    source источник
comment
Меня смущает ваш комментарий, вы говорите, что у вас есть три разных представления и три разные модели, но вы передаете один и тот же model_id своим представлениям.   -  person Vincent Briglia    schedule 15.05.2012
comment
model_id (один и тот же идентификатор) используется для выполнения трех разных выборок на сервер, что соответствует трем разным моделям данных. Я добавлю больше информации по моему вопросу.   -  person underscore666    schedule 15.05.2012
comment
такое ощущение, что вы строите свои данные вокруг своих представлений, а не своих представлений вокруг своих данных. Взгляните на следующий подключаемый модуль Backbone: github.com/PaulUithol/Backbone-relational и правильно настройте отношения между вашими данными.   -  person Vincent Briglia    schedule 15.05.2012
comment
Да, вы правы, возможно потому, что html и рестап были готовы, и я отвечал за реализацию bb. В любом случае, вы думаете, что единственный способ решить проблему — это использовать Backbone-relational? Было бы здорово, если бы у меня было быстрое решение.   -  person underscore666    schedule 15.05.2012


Ответы (2)


Чтобы соответствовать вашей проблеме, основанной на нашей беседе с комментариями, архитектура Backbone вращается с использованием событий, так почему бы не использовать агрегатор событий для отправки событий, не ограничивайте себя конструкциями магистрали. запускать событие из одного представления в другое в магистрали Этот шаблон обеспечивает элегантное решение вашей проблемы.

person Vincent Briglia    schedule 15.05.2012

Views должен реагировать не на прямые вызовы методов, а на события. Сказал, что вы либо создаете общий EventAggregator доступный из каждого представления (как объяснил @20100 в своем ответе), либо вы соединяете представления через общую модель и заставляете каждое представление слушать к более интересным событиям на нем.

В вашем случае вы можете создать экземпляр модели Movie из экземпляров Views и соединить вокруг него три View:

// code simplified and not tested
var MainView = Backbone.View.extend({
  initialize: function ( opts ) {
    this.movie = new Movie({ id: this.opts.movie_id} )
    this.movie.fetch();
    this.render();
  },

  render: function () {
    this.firstView = new FirstView( this.movie );
    this.secondView = new SecondView( this.movie );
    this.thirdView = new ThirdView( this.movie );
  }
});

var ThirdView = Backbone.View.extend({
  initialize: function( opts ) {
    this.movie = opts.movie;
    this.movie.on( "destroy", this.cleanUp, this )
    this.followers = // fetch the followers as you do now, use this.model.id
  }

  cleanUp: function(){
    // your clean up code when model is detroyed
  }
});
person fguillen    schedule 15.05.2012
comment
Мне нравится идея EventAggregator, но в вашем коде я не вижу, где я должен его поместить. Я полагаю, в MainView, а затем передаю его как параметр другим представлениям. Это правильно? - person underscore666; 15.05.2012
comment
Я не объясняю идею EventAggregator, это делает @20100. Но если очень похоже, вместо общего Model у вас есть общий EventAggregator, перейдите по ссылке в ответе @20100. - person fguillen; 15.05.2012