【问题标题】:Backbone.View: Delete different views related to different modelsBackbone.View:删除不同模型相关的不同视图
【发布时间】:2012-05-15 12:52:02
【问题描述】:

我需要显示与three different model 或集合相关的three different views
为了执行此任务,我编写了以下代码。 (*)
请告诉我这是否是正确的方法,无论如何它是有效的。

这是我的问题。
在其中一个视图中,假设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;
});

附:

_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时,与collection2和collection3相关的view2和view3应该被删除。

【问题讨论】:

  • 我对您的评论感到困惑,您说您有三个不同的视图和三个不同的模型,但您将相同的 model_id 传递给您的视图。
  • model_id(相同的id)用于对服务器执行三种不同的抓取,对应三种不同的数据模型。我将就我的问题添加更多信息。
  • 感觉您是在围绕视图构建数据,而不是围绕数据构建视图。查看以下 Backbone 插件:github.com/PaulUithol/Backbone-relational 并正确设置数据之间的关系。
  • 是的,你是对的,可能是因为 html 和 restapi 已经准备好了,我负责实现 bb。无论如何,您认为解决问题的唯一方法是使用 Backbone-relational 吗?对我来说现在有一个快速的解决方案会很棒。

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


【解决方案1】:

为了根据我们的 cmets 对话解决您的问题,Backbone 架构使用事件,所以为什么不使用事件聚合器来发送事件,不要将自己限制在主干构造中。 fire an event from one view to another in backbone 这个模式为您的问题提供了一个优雅的解决方案。

【讨论】:

    【解决方案2】:

    Views 不应响应直接方法调用,而应响应事件。说您要么从每个视图创建一个通用的EventAggregator 可访问(正如@20100 在他的回答中解释的那样),或者您通过通用模型连接视图并使每个视图监听 到它自己的更多有趣事件就可以了。

    在您的情况下,您可以从 Views 实例中实例化 Movie 模型并将其周围的三个 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
      }
    });
    

    【讨论】:

    • 我喜欢EventAggregator 的想法,但在你的代码中我看不到我必须把它放在哪里。我想在MainView 中,然后将其作为参数传递给其他视图。对吗?
    • 我不是在解释EventAggregator 的想法,@20100 就是这样做的。但如果非常相似,而不是有一个共同的Model,而是有一个共同的EventAggregator,请点击@20100 答案中的链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    • 2020-11-07
    相关资源
    最近更新 更多