4

私はまだBackbone.jsの周りに頭を抱えようとしています 私はいくつかのスクリーンキャストを見て、チュートリアルを読んできました。私もRTFM。しかし、私は、誰もがどのように異なるタスクを処理するためにフレームワークの一部を使用するように思われるか少し混乱しています。Backbone.js:モデル、コレクション、ルーター、いつ、そしてなぜ?

私は、本物のアプリでbackbone.jsで私の最初のショットを作ることを決めました。伝統的なtodoリストアプリで遊んだ後です。

私のアプリは質問でいっぱいのJSONオブジェクトを受け取ります。そして、私はそれらの質問(次のq、前のq)の周りを動かすことができる 'ul'を持っているのが好きです。私は既にボタンを表示し、ユーザーが '次へ'または '前'をクリックするたびに通知するビューを持っています。私の質問は、「currentQuestion」、「next」、「previous」の機能のロジックをどこで扱うべきかです。私はこのためにCollectionを使っている人やModelを使っている人がいるのを見たことがあります。それは私を混乱させます。

これを処理するには、誰でも私にいくつかのメタコードを指摘できますか?どうもありがとう!

答えて

7

実際にこの質問に対する正解はありません。確かにそれを動作させるための方法は複数あり、それは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と戻るボタンと物事はおそらく彼らが期待するように動作します。この問題は、nextQuestionpreviousQuestionボタンをどのように機能させるのでしょうか?

あなたがそれらをQuestionViewの一部にする場合、質問はその次と前の質問のIDが何であるかを知る必要があります。この作業を行うスキームを考え出すこともできますが、よりエレガントで頻繁に使用されるパターンは、すでに言及したすべてのデータモデルの上に存在する別のモデルを作成してQuestionsCollectioncurrent_question_idの属性にすることですモデル。次に、ルータのメソッドでこのcurrent_question_id attrを更新します。

私たちは本当に調理しています。アプリケーションの状態は、ブラウザのURLに保持されているだけでなく、アプリケーションレイヤでも観察可能なオブジェクトとして存在します。 ButtonsPanelViewを簡単に作成すると、このAppモデルが渡され、ボタンがクリックされたときに正しいルートがトリガーされます。 モデルにhasNextQuestionhasPreviousQuestionを実装し、それを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); 

    } 

}); 
+0

私は提案をすることができます、私はインデックスビューと呼ばれるコレクションレベルのビューを見てきました。したがって、 'QuestionView'は' QuestionIndexView'である可能性があります。これは 'QuestionView'とは視覚的に区別されます。私はそうでなければあなたの意見に同意し、バックボーンの複数のやり方が時折圧倒されることを追加するでしょう –

+1

'QuestionIndexView'を読むためにそれを更新しました。圧倒的に言えば、最初に学ぶときに少しトリッキーになることに同意しますが、普通のことから何かをしたいときには、より多目的になるというメリットがあると思います。より厳格なアーキテクチャを採用し、したがって一貫性を強化する他のフレームワークもあります。 IMHO [Emberjs](http://emberjs.com/)は例です – Matthew

+0

@Mathew、あなたの答えは素晴らしいです。これは本当にこれについていくつかの光を細断しました!私はこれが多くのことを求めていないことを願っていますが、 "すべてのデータの上に存在するモデル"を作る方法を詳しく説明できますか?それは私が立ち往生している場所です。 n個の質問がありますが、0から始めることがわかりますが、ユーザーが「次」または前をクリックしてそれに応じてビューを更新すると、そのインデックスを+1および-1に移動したいと考えています。結局私はbackbone.jsを使ったのです!どうもありがとう! – fedeisas

1

私がBackboneJSで理解したように、「モデル」はデータの単位です。例えば、「へ-DO項目」の単位データが含まれます

  • 日付を
  • メッセージ
  • データのこれらのユニット

がに格納されている状態」コレクション"。それらは「行」を含む「データベース表」と同義です。しかし、モデルデータは行のように2次元に限定されません。その後、バックボーンの「ビュー」はロジックを行い、インターフェイスと対話します。たとえば、「ビューコントローラ」のようになります。ビューには、イベントハンドラ、要素の追加と削除、インターフェイスの変更などのコードが含まれています。

+0

あなたの時間のために多くのありがとう。私はモデルのサーバー側の定義(モデルはいくつかの行を返すことができます)に慣れているようですので、本当に混乱しています。ありがとう! – fedeisas

関連する問題