如果骨干路由器或视图句柄获取数据并显示加载状态?(Should the backbone route

2019-06-24 23:16发布

在我的应用程序很多地方以下模式发生了:

  • 用户点击某个环节触发导航
  • 数据需要获取渲染视图
  • UI设计需要一个“加载”微调器被示出,而数据被取出
  • 一旦数据被取出我们展示了渲染视图

我曾尝试以下两个执行模式:

  1. 路由器把手取

    • 路由器告诉容器视图来显示正在加载的旋转
    • 路由器加载任何集合/模型
    • 路由器告诉容器视图隐藏加载微调
    • 路由器通过集合/模型视图,并使得它
  2. 视图处理取

    • 路由器只是创建和呈现视图
    • 该视图获取它需要的集合和模型
    • 当视图第一次呈现,它只是显示加载微调,因为数据仍在加载
    • 当数据到达时,该模型/集火事件和视图绑定到这些,因此重新呈现自身,从而隐藏加载微调和显示众目睽睽

我不喜欢#1,因为路由器成为型号/系列取逻辑的一个巨大的球,似乎有太多的责任。 #2好像责任更好地分配(路由器只是决定哪个视图显示,鉴于计算出它所需要的数据获取),但它确实使视图渲染有点麻烦,因为它现在是有状态的。

什么是StackOverflow的社会思考? 1,2,还是其他什么东西?

Answer 1:

这个职位是很老,但我们今天早些时候进行审查,所以万一别人遇到它:

对我来说,我真的看到两个独立的问题:

  1. 数据获取的机制和结果视图渲染应该在哪里发生,在路由器或看法?
  2. 应该指望意见已经解决了模型,还是应该以任何可能仍然在加载模型回应?

我们如何处理它与一些个人喜好混合了一下:

  1. 都不是,虽然我瘦更接近路由器。 路由器应该处理路由,意见应办理查看和别的东西应该处理机制和型号/系列取逻辑的工作流程。 我们称之为别的东西控制器,其路由器基本上代表们。
  2. 成宥利暗示,“有时”是一个现实。 我想这大概是由案件的判决情况,但最终应是一个控制器和视图之间的合同,而不是路由器/视图之间。

我喜欢尤里的要点,与一对夫妇的注意事项(缩进子弹):

  • 路由器只知道向何处发送用户
  • 外观图只知道用户要观看(因为其数据)
    • 假设外视图是特定于内视图的用例,并且由另一视图“拥有”(用于清理)
    • 否则,对于普通的容器(如渲染成“主”的位置),我们发现它非常有用的管理一定“节”的意见,页面上的组件 - 我们称之为渲染
  • 内部意见只知道如何表达自己的只有小部分的这一切(和可以在其他地方使用)
  • 和渲染功能总是显示正确的事作为现在。
    • 在一个通用的容器的情况下,它会最终成为渲染的责任

为渲染器的主要原因是处理与该节相关的东西,比如清理现有的意见,以避免鬼意见,滚动顶端上渲染(我们MainContentRenderer确实是),或表示在这种情况下,微调。

什么可能的样子,对于一个伪码上下的例子:

  • 通用内容目标“主”(如果它是用特定的情况下,可能会更好用的ComponentView按照尤里的例子,这取决于你的观点生命周期管理策略)
  • 一个模型中,我们必须获取并等待
  • 接受已加载模型的图

路由器:

routes: {
    "profile": "showProfile"
},

showProfile: function() {
    return new ProfileController().showProfile();
}

ProfileController可:

showProfile: function() {
    //simple case
    var model = new Model();
    var deferredView = model.fetch.then(function() {
        return new View(model);
    };
    MainContentRenderer.renderDeferred(deferredView);
}

MainContentRenderer:

var currentView;

renderDeferred: function(deferredView) {
    showSpinner();
    deferredView.then(function(view) {
        this.closeSpinner();
        this.closeCurrentView();
        this.render(view);
    }
},

render: function(view) {
    currentView = view;
    $('#main-content').html(view.render().el);
}

closeCurrentView: function() {
    if (currentView and currentView.close()) {
        currentView.close();
    }
}

介绍一个控制器还具有可测性的好处。 例如,我们周边的URL管理执行搜索,一个结果视图和一个新的搜索视图之间选择,并缓存“最后”的搜索结果之间的选择和执行新的搜索复杂的规则。 我们有茉莉花测试的控制器,以验证所有的流程逻辑是正确的。 它还提供了一个与世隔绝的地方来管理这些规则。



Answer 2:

我倾向于使用第二个选项有三个观点,集装箱,装载视图和内容视图。 也就是说,容器是由路由器实例化,并在每个渲染它看起来什么它手头上显示,有时路由器提供,有时本身,并决定什么看法(S)来实例化。 一个简单的,人为的例子:

ContainerView = Backbone.View.extend({

  initialize: function (options) {
    options.data.bind("reset", this.render, this);
  },

  render: function () {
    var view;

    // If the loading view is only shown once, e.g., splashing, then isReady()
    // may be better here.
    if (this.options.data.isLoading()) {
      view = LoadingView;
    } else {
      view = DataView;
    }

    this.$("div.content").html(new view().render().el);
  }

});

我喜欢这种做法,因为:

  • 路由器只知道向何处发送用户;
  • 外视图仅知道用户应当查看的内容 (由于其数据);
  • 内部意见只知道如何表达自己的只有小部分的这一切(和可以在别处使用); 和
  • 渲染功能总是显示正确的事作为现在。

澄清:该视图的目的,在这种情况下,是要了解什么是必须表现出最好应该显示给用户。 在这种情况下,位数据仍在加载的最好用装载视图中示出,而准备数据最好用数据视图中示出。 最真实的观点实际上是构成它们的显示多了很多意见,例如,根据用户权限的不同动作的容器。



文章来源: Should the backbone router or view handle fetching data and displaying loading status?
标签: backbone.js