あなたが説明しているこのタイプのアプリケーションには、Backbone.jsを使用するだけで完璧だと思います。おそらくすでにこれを読んでいますが、バックボーンの文献のほとんどは、サーバーで生成されたJSONモデルとコレクションを関連付け、ビューのレンダリング関数を使用してモデル/コレクションを表すHTML UIを(クライアントで)生成するビューに焦点を当てています。
ただし、このように使用する必要はありません。実際、すでにコンテンツを含む既存の要素にビューをアタッチすることを妨げるものは何もありません。これにより、Backboneのモジュール性、イベントシステムなどのすべての利点が得られます。私は、スタイルの適合性が好きであるという理由だけで、モデルやコレクションのないビューをよく使用します。また、REST APIをまだ取得していない、または提供する予定のない古い既存のアプリケーションを使用する必要がある場合に、以下で説明するようなアプローチを使用しましたが、HTMLでコンテンツを提供します。
まず、次のHTMLがウィジェットの1つを表すと仮定します。
<div id="widget">
<div class="widget-title"></div>
<div class="widget-body">
<!-- assume lots more html is in here -->
<a href="/Controller/DoWidgetStuff">Do something!</a>
</div>
</div>
この場合、単一のWidget
モデルでバックボーンを使用できます。これは、次のような非常に単純なモデルになります。
App.WidgetModel = Backbone.Model.extend({
intialize: function () {
this.url = this.options.url;
}
});
ウィジェットがコンストラクター/初期化関数へのパラメーターとしてURLを受け取るという事実に注意してください。このウィジェットモデルは、ウィジェットの多くを表します(もちろん、より複雑なモデルでこの一般的なアプローチを採用し、レンダリングされたHTMLからさまざまなデータを取得することもできます)。それでは、次はあなたの意見です。ご存知かもしれませんが、通常、インスタンス化するときに、ほとんどのビューをモデルまたはコレクションに渡します。ただし、この場合、ビューの初期化関数でウィジェットモデルを作成し、次のように事前にレンダリングされたHTMLからURLを渡すことができます。
App.WidgetView = App.View.ComboboxView = Backbone.View.extend({
initialize: function () {
this.model = new App.WidgetModel({}, { url: this.$("a").attr("href") });
}
// rest of the view code
});
したがって、ビューのインスタンス化は次のようになります。
new App.WidgetView({el: $("#widget")})'
上記のすべてを実行することにより、バックボーンが提供する他のほとんどすべてを実行でき、モジュール式で適切にカプセル化されます。これが、あなたが求めていることです。
このアプローチ全体の最終結果は次のとおりです。
- ウィジェットUIを純粋なHTMLとしてレンダリングしました。これは(私が思うに)JavaScriptなしで機能します。
- ビューを既存のHTMLに添付します。
- jQueryを使用してレンダリングされたHTMLから抽出されたコンテンツ(URLなど)をオプションとしてビューに渡します。
- ビューは、モデルが必要とする関連オプション(URLなど)を渡すモデルをインスタンス化する役割を果たします。
- これは、すべての動的サーバー側コンテンツが最初にレンダリングされたHTMLに含まれ、ビューがモジュール式のJavaScriptコンポーネントであり、それに対して何かを実行できることを意味します。これが最終結果だと思います。
ですから、ウィジェットにAJAX機能を持たせたいとおっしゃいましたが、このアプローチでも問題ありません。このアプローチを使用すると、モデルの標準のバックボーンfetch
とsave
関数を使用Widget
して新しいコンテンツを取得できるようになります。この例では、レンダリングされたHTMLから取得したURLからのものです。応答を受け取ったら、ビュー、レンダリング関数、またはその他のより細かい関数を使用して、必要に応じてページ上のHTMLを更新できます。
いくつかのポイント:
fetch
サーバーが提供しているものである場合は、 andsave
関数のコンテンツタイプを「text/html」に変更する必要があることに注意してください。例えば:
this.model.fetch({
type: "POST",
contentType: "text/html"
});
最後に、私が提案したモデルは、コンテンツなしでインスタンス化されます。ただし、ajax呼び出しが「text / html」のコンテンツタイプである場合は、このコンテンツを属性コレクションに適切に格納できるように、モデルをいじくり回す必要がある場合があります。詳細については、この回答を参照してください。