Backbone.View:删除与不同模型相关的不同视图

时间:2012-05-15 12:52:03

标签: javascript backbone.js backbone-relational backbone-views

我需要显示与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)

当我删除model1时,应删除与collection2和collection3相关的view2和view3。

2 个答案:

答案 0 :(得分:1)

为了根据我们的评论对话来适应您的问题,Backbone架构使用事件进行循环,因此为什么不使用事件聚合器来发送事件,不要将自己局限于骨干构造。 fire an event from one view to another in backbone此模式为您的问题提供了一个优雅的解决方案。

答案 1 :(得分:1)

Views不应该响应直接方法调用,而应该响应事件。说你要么从每个视图创建一个公共EventAggregator可访问(正如@ 20100在他的回答中解释的那样),要么通过通用模型连接视图,并将每个视图设为到它自己的更多有趣的事件。

在您的情况下,您可以从Views实例化中实例化Movie模型并连接它周围的三个视图:

// 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
  }
});