0

以下は、バックボーン アプリケーションで何が起こっているかの基本的な概要です。

  1. ルーターは新しいプロファイル ビューを作成し、ユーザー名を渡します。
  2. 新しいプロファイルが初期化されると、渡されたユーザー名で新しいユーザーが作成されます。
  3. その後、プロファイルはこのユーザーに関する詳細を取得します。
  4. ここで迷ってしまいます…

これらは私の質問です:

  1. 意図したとおりにバックボーンを使用していますか、それとも構造を再考する必要がありますか?
  2. プロファイル ビューには、renderハンドルバーを使用する機能があります。ビューをレンダリングするには、ユーザーの詳細をハンドルバーに渡す必要があります。これを行う最善の方法は何ですか?
  3. 関数を実際にどこで呼び出す必要がありrenderますか?

これが私のコードです(コメントされた質問に注意してください):

ルーター

var Router = Backbone.Router.extend({
  routes: {
    ":username": "profile"
  },
  profile: function (username) {
    var profile = new Profile({username: username});
  }
});

モデル

var User = Backbone.Model.extend({
  urlRoot: 'http://api.example.com/user'
});

意見

var Profile = Backbone.View.extend({
  el: "#content section",
  initialize: function(username) {
    var user = new User({id: this.options.username});
    user.fetch({
      beforeSend: authenticate,
      success: function() {
        //*************************************************************
        // How do I make this result available to the render function?
        //*************************************************************
      },
    });
  },
  render: function() {
    alert(JSON.stringify(this.context));
    var source = $("#profile").html();
    var template = Handlebars.compile(source);
    //**********************************************************************
    // How do I set context equal to the result of the initialize function?
    //**********************************************************************
    var html = template(context);
    $("#content section").html(html);
  }
});
4

2 に答える 2

2
  1. 意図したとおりにバックボーンを使用していますか、それとも構造を再考する必要がありますか?
  2. プロファイル ビューには、renderハンドルバーを使用する機能があります。ビューをレンダリングするには、ユーザーの詳細をハンドルバーに渡す必要があります。これを行う最善の方法は何ですか?
  3. 関数を実際にどこで呼び出す必要がありrenderますか?

Rayweb はすでに 2 と答えているので、1 と答えます (そして 3 ですが、あまり重要ではありません)。

質問 1: はい、あなたのやり方は間違っています。なんで?ビュー内でモデルを作成しており、モデルをビューにリンクしていません。これは、単なる OOP 機能ではなく、MV* フレームワークであるバックボーンの目的を無効にします。モデルを作成し、それを引数としてビューに渡す必要があります。これにより、1 つのモデルに関する情報を異なるビューで共有できます。

var model = new Model();
var view = new View({model:model});
var view2 = new View2({model:model});

そうすれば、モデルを this.model.fetch() で更新することができ、更新されたデータを持つ this.model としてすべてのビューでアクセスできるようになります (Rayweb が彼のコードで示したように)。

3 に関しては、ビューを更新したいときはいつでも render を呼び出してください。実際のルールはありません。

于 2013-06-05T21:47:08.757 に答える