【问题标题】:Render a Marionette region after model has been fetched获取模型后渲染木偶区域
【发布时间】:2013-03-19 11:06:53
【问题描述】:

我想使用 Derick Bailey 在此thread 的“一般问题解决方案”中描述的方法在获取模型后渲染视图。我将在这里报告他的解决方案:

 MyView = Backbone.View.extend({
  initialize: function(){
    this.model.on("sync", this.render, this);
  },

  render: function(){ ... }
});


myModel = new MyModel({id: someId});
new MyView({
  model: myModel
});

myModel.fetch();

我的情况略有不同:我的视图位于区域布局内。如果我调用 Marionette.Region.show() 它可以工作,但视图会呈现两次。调用 Marionette.Region.attachView() 会调用一次视图渲染函数,但页面中不显示内容。

有什么想法吗?

【问题讨论】:

  • 如果您使用 Marionette 区域和视图,则每次模型更改时视图都会更新。因此,如果您只希望视图呈现一次,则必须在调用该区域的 show 方法之前获取模型。

标签: javascript backbone.js marionette


【解决方案1】:

您可以等到模型同步后再渲染视图


var myView = new MyView({
  model: myModel
});

myModel.on("sync", function(){
  myRegion.show(myView);
});

myModel.fetch();

【讨论】:

    【解决方案2】:

    我想出了一个稍微不同的方法。我需要我的观点来在 initalize 上加载他们自己的模型,所以 Derick 的方法对我来说并不真正有效。有几个原因我不想在这里解释。但我来了是这样的:

    我创建了一个名为加载指示器和微调器的默认模板,我将其附加到视图的模板。我有一个名为 updateView 的方法,一旦模型同步并用真实模板替换加载模板并随后调用 render() 就会触发该方法。

    也许有人也会觉得它有用。

    var myView = new MyView({
         template: loader,
         initialize : function(){
            this.model = new MyModel();
            this.model.on("sync", this.updateView, this);
            this.model.fetch();
         },
         updateView : function(){
            this.template = myTemplate;
            this.render();
         }
    });
    

    【讨论】:

    • 嗯,如果在渲染阶段(渲染、显示、附加事件之间)完成获取会发生什么?它不会导致奇怪的问题,比如视图被附加到 DOM 两次,或者多个事件处理程序?
    • 由于 javascript 是单线程的,渲染和事件绑定将在另一个触发之前完成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    • 2014-03-07
    相关资源
    最近更新 更多