5

このスレッドの「 A Generic Problem Solution 」で Derick Bailey が説明したアプローチを使用して、モデルがフェッチされた後にビューをレンダリングしたいと思います。ここで彼の解決策を報告します:

 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() を呼び出すと機能しますが、ビューは 2 回レンダリングされます。Marionette.Region.attachView() を呼び出すと、ビュー レンダーの関数が 1 回呼び出されますが、コンテンツはページに表示されません。

何か案が?

4

2 に答える 2

13

ビューをレンダリングする前に、モデルが同期されるまで待つことができます


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

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

myModel.fetch();
于 2013-03-19T19:23:59.693 に答える
4

私は少し異なるアプローチを考え出しました。初期化時に独自のモデルをロードするビューが必要なので、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();
     }
});
于 2013-07-19T14:01:11.767 に答える