3

バックボーン ビューをレンダリングする前に、追加の変数 (ユーザー ID) を渡したいと思います。私は ajax リクエストで追加の変数を取得していますが、非同期であるため、変数を取得する前にページがレンダリングされていると思います。簡単にするために、バックボーンビューにこれがあるとしましょう:

PostsApp.Views.Post = Backbone.View.extend({
    template: _.template($('#post-template').html()),

    render: function(){
        var newObject = this.model.toJSON();
        $.ajax({
            url:"/user",
            success:function(result){
                newObject.twittername = result.name; ;
            }
        });
        this.$el.html(this.template(newObject));
    }

});

this.$el.html(this.template(newObject)); を置くことができると思います。コールバックではありますが、「this」は他の何かを参照しています..誰かがこれの回避策を考えられますか?

それとも、レンダリング機能でそのようなリクエストを送信するのは非常に悪いことですか..

4

1 に答える 1

6

あなたの仮定は正しいです。正しくレンダリングされません。

簡単な修正

より一般的なケースと同様に、successコールバック内で実際のレンダリングを実行できます。

 render: function(){
        var newObject = this.model.toJSON();
        var that = this; // to fix that `this` refers to in the callback
        $.ajax({
            url:"/user",
            success:function(result){
                newObject.twittername = result.name; ;
                that.$el.html(that.template(newObject));
            }
        });
    }

より良い修正

私がすることは次のとおりです。

  • モデルの一部として Twitter の名前を持っている
  • モデルからそれを取得します(おそらく安らかな.fetch
  • ビュー内のイベントをリッスンしchange、そのようなイベントで render を呼び出します。

これは、ビューがバックボーンのモデル データを変更する責任を負うべきではないためです。「ビジネスロジック」とプレゼンテーションが混在していて、すぐに醜くなる可能性があります。

[Addy Osmani の「Backbone Fundamentals」からのこの例2は、この種の構造がどのようにレイアウトされているかについての一般的なアイデアを与えるはずです。

于 2013-06-14T16:38:43.267 に答える