実際にこの質問に対する正解はありません。確かにそれを動作させるための方法は複数あり、それはBackbonejsの素晴らしい点の1つです。非常に柔軟性があり、あまりにも多くのデザインを選択する必要はありません。私はあなたが記述しているものを構築を開始した場合
、私は確かだろう。
Question
モデル
Questions
コレクション
- 単一の質問をレンダリングするための
QuestionView
- 質問のリストを表示するための
QuestionsIndexView
その後、状況が少しばかげてしまい、アプリケーションの要件によって異なります。あなたは状態が伝統的なウェブサイトのように保存することがしたい場合は、ルーターを使用して、次のようになります何かをするかもしれません。
ApplicationRouter = Backbone.Router.extend({
routes: {
"": "index",
"question/:id": "show"
},
index: function() {
// render a QuestionsIndexView...
},
show: function(id) {
// find the q and render a QuestionView...
}
})
、ユーザがブラウザを使用することができますので状態はURLで維持されているので、これはいいですfwdと戻るボタンと物事はおそらく彼らが期待するように動作します。この問題は、nextQuestion
とpreviousQuestion
ボタンをどのように機能させるのでしょうか?
あなたがそれらをQuestionView
の一部にする場合、質問はその次と前の質問のIDが何であるかを知る必要があります。この作業を行うスキームを考え出すこともできますが、よりエレガントで頻繁に使用されるパターンは、すでに言及したすべてのデータモデルの上に存在する別のモデルを作成してQuestionsCollection
とcurrent_question_id
の属性にすることですモデル。次に、ルータのメソッドでこのcurrent_question_id
attrを更新します。
私たちは本当に調理しています。アプリケーションの状態は、ブラウザのURLに保持されているだけでなく、アプリケーションレイヤでも観察可能なオブジェクトとして存在します。 ButtonsPanelView
を簡単に作成すると、このApp
モデルが渡され、ボタンがクリックされたときに正しいルートがトリガーされます。 モデルにhasNextQuestion
とhasPreviousQuestion
を実装し、それをtoggle
に使用するか、ユーザーが前後に移動できないときにそれぞれのボタンを無効にすることも自明です。要求されたよう
EDIT:
他のすべての上に存在するApp
モデルを作ることは非常に簡単です。あなたはおそらくすでにこのようになりますどこかのコードを持っている:
window._qs = new Questions();
window._qs.fetch();
はただ、代わりにこれを行う:今Questions
コレクションは、我々が望んでいたのと同様に、アプリモデルの属性である
var qs = new Questions();
window.app = new App({questions: qs});
qs.fetch();
を。では、App
の定義はどうなっていますか?繰り返しますが、これについては多くの方法がありますが、私はBackbone.Models's validateを使用して、悪い状態になっていないことを確認します。ここに私がすることがあります:
App = Backbone.Model.extend({
defaults: {
current_question_index: 0
},
validate: function(attrs) {
if(typeof attrs.current_question_index !== "undefined") {
// we are trying the change the question index,
// so make sure it is valid
var len = this.get("questions").length
if(attrs.current_question_index < 0 || attrs.current_question_index >= len) {
// returning anything prevents invalid set
return "index is out of bounds";
}
}
},
hasNextQ: function() {
var next_ind = this.get("current_question_index") + 1;
// use the logic we already created, in validate() but
// convert it to a bool. NOTE in javascript:
// !"stuff" === false
// !undefined === true
return !this.validate({current_question_index: next_ind});
},
nextQ: function() {
var next_ind = this.get("current_question_index") + 1;
// validate() will prevent us from setting an invalid index
return this.set("current_question_index", next_ind);
}
});
私は提案をすることができます、私はインデックスビューと呼ばれるコレクションレベルのビューを見てきました。したがって、 'QuestionView'は' QuestionIndexView'である可能性があります。これは 'QuestionView'とは視覚的に区別されます。私はそうでなければあなたの意見に同意し、バックボーンの複数のやり方が時折圧倒されることを追加するでしょう –
'QuestionIndexView'を読むためにそれを更新しました。圧倒的に言えば、最初に学ぶときに少しトリッキーになることに同意しますが、普通のことから何かをしたいときには、より多目的になるというメリットがあると思います。より厳格なアーキテクチャを採用し、したがって一貫性を強化する他のフレームワークもあります。 IMHO [Emberjs](http://emberjs.com/)は例です – Matthew
@Mathew、あなたの答えは素晴らしいです。これは本当にこれについていくつかの光を細断しました!私はこれが多くのことを求めていないことを願っていますが、 "すべてのデータの上に存在するモデル"を作る方法を詳しく説明できますか?それは私が立ち往生している場所です。 n個の質問がありますが、0から始めることがわかりますが、ユーザーが「次」または前をクリックしてそれに応じてビューを更新すると、そのインデックスを+1および-1に移動したいと考えています。結局私はbackbone.jsを使ったのです!どうもありがとう! – fedeisas