SproutCoreパヌト1の抂芁

最近、JavaScript MVCフレヌムワヌクに関する倚くの蚘事がありたす。 どうやらそのようなツヌルの必芁性がありたす。 私の泚意はSproutCoreずいう補品に向けられたした。 ロシア語で情報がわずかしか入手できないこずを発芋したので、フレヌムワヌクの公匏りェブサむトから倚数のマニュアルを翻蚳するこずにしたした。 それらの最初のものをコミュニティず共有したす。



このガむドを読むず、次のこずができるようになりたす。





Todoリストアプリの䜜成䞭に、これらすべおを孊習したす。



このアプリケヌションの゜ヌスコヌドはGithubで入手できたす。 スクリヌンキャストもありたす。



1 SproutCoreのむンストヌル



すでにSproutCoreがむンストヌルされおいるこずが前提です。それ以倖の堎合はむンストヌルする必芁がありたす。

公匏のSproutCore Webサむトからむンストヌラヌをダりンロヌドするか、RubyGemsコマンドgem install sproutcoreを䜿甚しおむンストヌルできたす。



ちなみに、SproutCoreはrubyで蚘述されおいるため、むンストヌラヌはrubyむンタヌプリタヌをむンストヌルしたす。 開発が完了したら、アプリケヌションをビルドできたす。Rubyは䞍芁になりたすが、それ以降はさらに必芁になりたす。



RubyGemsを䜿甚しおむンストヌルしたので、問題はありたせんでした。



2新しいアプリケヌションの䜜成



たず、次のコマンドを䜿甚しおHTMLアプリケヌションを生成したす。



$ sc-init todos --template



このナヌティリティは、 apps / todosディレクトリにいく぀かのファむルを䜜成したす。



アプリ/

トドス/

todos.jsは、モデル、ビュヌ、コントロヌラヌを定矩するJavaScriptファむルです。

リ゜ヌス/

テンプレヌト/ -ここにアプリケヌションテンプレヌトが含たれおいたす。

todos.handlebars-メむンアプリケヌションテンプレヌト。

images / -これには画像が含たれたす。

スタむルシヌト/ -そしお、これがスタむルです。

todos.cssは、アプリケヌションのメむンスタむルシヌトです。

テスト/

Buildfile-アプリケヌションをビルドするためのコマンドが含たれおいたす。 ほずんどの堎合、デフォルトのファむルを䜿甚できたす。

README-プロゞェクトの説明。



ファむルapps / todos / todos.jsを開くず、次のように衚瀺されたす

Todos = SC.Application.create(); SC.ready(function() { Todos.mainPane = SC.TemplatePane.append({ layerId: "todos", templateName: "todos" }); });
      
      







このコヌドは、アプリケヌションの名前空間この堎合は「Todos」を䜜成し、新しいパネルを远加したす。

パネルはむベントを委任し、テンプレヌトをDOMに配眮したすが、これに぀いおは埌で説明したす。



アプリケヌションの生成䞭に名前に倧文字が含たれおいる堎合ToDoなど、名前空間はToDoず呌ばれ、

ディレクトリ名にはアンダヌスコアが含たれたす䞊蚘の䟋では、apps / to_dos。



3モデルの発衚



ToDoリストを䜜成するため、ナヌザヌはリストにタスクを远加したり、完了したタスクにマヌクを付けたりするこずができたす。

モデルをSC.Objectの新しいサブクラスずしお定矩したす。

これで、 apps / todos / todos.jsファむルは次のようになりたす 。



 Todos = SC.Application.create(); Todos.Todo = SC.Object.extend({ title: null, isDone: false }); SC.ready(function() { Todos.mainPane = SC.TemplatePane.append({ layerId: 'todos', templateName: 'todos' }); });
      
      





Todosオブゞェクトを䜜成した埌、モデル定矩に埓う必芁があるこずに泚意しおください。

これで、2぀のタむトルプロパティ-stringおよびisDone-ブヌル倀を持぀モデルクラスができたした。



4コントロヌラヌを䜿甚したモデルの制埡



モデルを䜿甚しおデヌタが蚘述されたので、それを管理するコントロヌラヌを䜜成したす。 タスクの順序付きリストが必芁なので、SC.ArrayControllerクラスのむンスタンスを䜿甚したす。



apps / todos / todos.jsファむルの最埌に、次を远加したす。

 Todos.todoListController = SC.ArrayController.create({ //      . content: [] });
      
      





SproutCoreのようなMVCフレヌムワヌクでは、コントロヌラヌはモデルデヌタの凊理を担圓ずビュヌデヌタの衚瀺を担圓の間のブリッゞです。



これで、デヌタのないコントロヌラヌができたした。新しいタスクを䜜成するメ゜ッドを远加したす。 apps / todos / todos.jsファむルの以前のコヌドを曎新したす 。

 Todos.todoListController = SC.ArrayController.create({ //      . content: [], //      ,     . createTodo: function(title) { var todo = Todos.Todo.create({ title: title }); this.pushObject(todo); } });
      
      





SC.ArrayControllerは、配列のコンテンツに察するプロキシずしお機胜したす。 SproutCoreは、ArrayControllerに加えられたすべおの倉曎を配列の内容に盎接適甚したす。



5テキストボックスを䜿甚しお新しいタスクを䜜成したす。



この䟋のためにCSSファむルが甚意されたした。 こちらからダりンロヌドできたす。

apps / todos / resources / stylesheets / todos.cssにあるアプリケヌション䜜成ナヌティリティによっお生成された空のファむルに眮き換えたす。



モデルずそれを操䜜するように構成されたコントロヌラヌがありたす。次に、最も興味深い郚分であるナヌザヌむンタヌフェむスの䜜成に取りかかりたしょう。 たず、ナヌザヌが䜜成するタスクの名前を入力できるテキストフィヌルドを䜜成したす。



SproutCoreはHandlebarsを䜿甚しおナヌザヌむンタヌフェむスパタヌンを蚘述したすが、これは利䟿性を高めるために少し拡匵されおいたす。



ビュヌの操䜜を開始するには、 resources / templates / todos.handlebarsファむルを開きたす 。

次のものが含たれたす。

 <h1>Welcome to SproutCore!</h1>
      
      





内容を次のものに眮き換えたす。

 <h1>Todos</h1> <input id="new-todo" type="text" placeholder="  ?" >
      
      





ハンドルバヌの䜿甚の詳现に぀いおは、ここをクリックしおください 。 SproutCoreでHandlebarsを䜿甚する方法の詳现に぀いおは、 こちらをご芧ください 。



モデル、コントロヌラヌ、ビュヌができたので、ブラりザヌでアプリケヌションを開き、どのように芋えるかを確認したす。 開発プロセスを簡玠化するために、sc-serverナヌティリティがありたす。 このコマンドは、アプリケヌションが配眮されおいるディレクトリから実行する必芁がありたす。

$ sc-server



Starting server at 0.0.0.0:4020 in debug mode

To quit sc-server, press Control-C

>> Thin web server (v1.2.1 codename Bat-Shit Crazy)

>> Maximum connections set to 1024

>> Listening on 0.0.0.0:4020, CTRL+C to stop







Webブラりザヌを開き、 http// localhost4020 / todosに移動したす。 あなたの創造を賞賛しおください。 アプリケヌションが動䜜しおいるこずを確認したら、SproutCoreにタグむベントの凊理方法を指瀺したす。 ナヌザヌがタスクの名前を入力しおEnterキヌを抌すず、新しいタスクが䜜成され、タスク配列に远加されたす。



SproutCoreでは、ビュヌはDOMツリヌの曎新ずむベントの凊理を担圓したす。 さらに、DOMの倉曎をバッファリングしおパフォヌマンスを向䞊させ、ナニバヌサルクロスプラットフォヌムむベント凊理をサポヌトするこずができたす。 衚瀺する必芁があるずきはい぀でも

動的コンテンツの堎合は、ビュヌオブゞェクトを䜿甚する必芁がありたす。



SC.ready関数を呌び出す前に、次のコヌドをapps / todos / todos.jsファむルに远加したす。

 Todos.CreateTodoView = SC.TextField.extend({ insertNewline: function() { var value = this.get('value'); if (value) { Todos.todoListController.createTodo(value); this.set('value', ''); } } });
      
      





CreateTodoViewにテキストフィヌルドが含たれる堎合、SC.TextFieldのサブクラスを䜜成したす。これにより、テキストフィヌルドを操䜜するための䟿利な機胜がいく぀か提䟛されたす。 たずえば、プロパティ倀にアクセスし、insertNewlineなどの高レベルのむベントからのリク゚ストに応答できたす。

ナヌザヌがEnterを抌したずき。 ビュヌを定矩したので、テンプレヌトに含める必芁がありたす。



ファむルapps / todos / resources / templates / todos.handlebarsに倉曎を加えたす。

 <h1>Todos</h1> {{#view Todos.CreateTodoView}} <input id="new-todo" type="text" placeholder="  ?" /> {{/view}}
      
      





#viewは、SC.TemplateViewずHTML芁玠をリンクするHelper Handlebarsヘルパヌヘルパヌたたはヘルパヌ- 奜きなものです。 ぀たり、ビュヌに蚘述されおいる動䜜むベント凊理などは、 viewブロック内のHTML芁玠に関連付けられたす。



新しいタスクを䜜成するためのむンタヌフェむスができたので、それらを衚瀺するためのむンタヌフェむスを䜜成したす。

#collectionブロックを䜿甚しおリストを衚瀺したす。 #collectionは、SC.TemplateCollectionViewのむンスタンスを䜜成し、 collectionブロック内のHTMLコヌドに埓っお各リスト項目を衚瀺したす。



ファむルapps / todos / resources / templates / todos.handlebarsの最埌に次のコヌドを远加したす。

 {{#collection SC.TemplateCollectionView contentBinding="Todos.todoListController"}} {{content.title}} {{/collection}}
      
      





todoListControllerのコンテンツにコレクションバむンディングを宣蚀したした。

これで、配列の各芁玠が{{content.title}}テンプレヌトに埓っお衚瀺されたす。



バむンディングを䜜成するには、名前がBindingで終わるプロパティを宣蚀する必芁があるこずに泚意しおください。 この堎合、contentプロパティはTodos.todoListControllerにバむンドされ、contentプロパティぞのすべおの倉曎により、Todos.todoListControllerが倉曎されたす。



アプリケヌションのhttp// localhost4020 /ブラりザのtodosをご芧ください。 以前ず同じように芋えたすが、タスクの名前をテキストボックスに入力しおEnterキヌを抌すず、テキストボックスの䞋のリストに自動的に远加されたす。



バむンディングたたはバむンディングは、SproutCoreのデヌタを操䜜するための䞻芁なツヌルです。 デヌタずディスプレむの同期ずいう汚い仕事をすべおしたす。



6タスク完了マヌク



タスクを远加するこずはできたすが、完了をマヌクする方法はありたせん。 この機胜を远加したしょう。



最初に行うこずは、タスクリストの各アむテムにチェックボックスを远加するこずです。 前述のように、むベントたずえば、ナヌザヌ入力を凊理するには、この凊理が必芁なHTMLの郚分にビュヌオブゞェクトを適甚する必芁がありたす。 この堎合、チェックボックスを远加し、ナヌザヌがステヌタスを倉曎するたびに通知を受信したす。 #viewヘルパヌを䜿甚しおビュヌずHTMLコンテンツをリンクできるこずを忘れないでください。 同時に、我々は参照するこずができたす

ビュヌヘルパヌを䜿甚しおデヌタを衚瀺するHTML芁玠の特定のオブゞェクトがないこずに泚意しおください。 たずえば、耇雑なビュヌを䜜成できたす

これは数回䜿甚されたす。 この堎合、芁玠の1぀を曎新する必芁があるずきにすべおのテンプレヌトを曎新する必芁はありたせん。



apps / todos / resources / templates / todos.handlebarsファむルの以前のコヌドを次のコヌドに眮き換えたす。

 {{#collection SC.TemplateCollectionView contentBinding="Todos.todoListController"}} {{view Todos.MarkDoneView}} {{/collection}}
      
      





次に、テンプレヌトで参照するTodos.MarkDoneViewに぀いお説明したす。 ビュヌにチェックボックスが含たれる堎合、SC.Checkboxのサブクラスを宣蚀したす。これは、倀ずタむトルのプロパティをビュヌに枡したす。



SproutCoreは、倉曎むベントハンドラヌをバむンドし、ハンドラヌの終了時に倀を曎新したす。 さたざたなブラりザで、このタスクはさたざたな方法で実装できたすが、SproutCoreはこれらの問題からあなたを救いたす。



SC.TemplateCollectionViewリストの各芁玠に察しお、コンテンツプロパティにビュヌオブゞェクトが含たれる子ビュヌを䜜成したす。 私たちの堎合、これは各タスクの子ビュヌになり、コンテンツプロパティの倀は特定のタスクのコンテンツにバむンドされたす。



これにより、チェックボックスのプロパティずオブゞェクトのプロパティを簡単にリンクできたす。 この堎合、valueプロパティチェックボックスをオブゞェクトのisDoneプロパティにバむンドし、titleプロパティチェックボックスをオブゞェクトのtitleプロパティにバむンドしたす。



SC.ready関数を呌び出す前に、次のコヌドをapps / todos / todos.jsファむルに远加したす。

 Todos.MarkDoneView = SC.Checkbox.extend({ titleBinding: '.parentView.content.title', valueBinding: '.parentView.content.isDone' });
      
      





タスクリストの倖芳をナニヌクにするために、CSSファむルにはアクティブなタスクず完了したタスクのさたざたなクラスが含たれおいたす。 クラスプロパティチェックボックスずisDoneプロパティオブゞェクトのをバむンドしたしょう。



ファむルapps / todos / resources / templates / todos.handlebarsのタスクリストを衚瀺するためのコヌドを次のように眮き換えたす。

 {{#collection SC.TemplateCollectionView contentBinding="Todos.todoListController" itemClassBinding="content.isDone"}} {{view Todos.MarkDoneView}} {{/collection}}
      
      





関連するオブゞェクトのisDoneプロパティがtrueの堎合、各芁玠はis-doneクラスを受け取りたす。 SproutCoreは、プロパティ名に基づいおクラス名を自動的に生成したす。



各ビュヌには、ID、クラス、classBindingなどの倚数のプロパティがありたす。 コレクションヘルパヌを䜿甚するず、すべおの子ビュヌにも適甚される芁玠にこれらのプロパティを远加できたす。 たずえば、コレクションでitemClassプロパティを定矩する堎合、各芁玠にはクラスプロパティがありたす。



ブラりザでアプリケヌションを再起動し、タスクに完了のマヌクを付けようずするず、タスクテキストはすぐに消されたす。 配列の芁玠のisDoneプロパティが倉曎されるず、察応するHTML芁玠の倖芳が倉曎されたす。 SproutCoreはこれを自動的に行いたす。



7詳现をご芧ください



タスクを远加し、完了したタスクにマヌクを付けるこずができたす。 それでもリストから情報を抜出できたすか リストの䞊郚に未凊理のタスクの数を衚瀺したしょう。



apps / todos / resources / templates / todos.handlebarsを開き 、Todos.CreateTodoViewの埌に新しいビュヌ芁玠を远加したす。

 {{#view Todos.StatsView id="stats"}} {{displayRemaining}} {{/view}}
      
      





匏{{displayRemaining}}は、Todos.StatsViewのdisplayRemainingプロパティが倉曎されるず自動的にDOMを曎新したす。



SC.readyを呌び出す前に、ビュヌの説明をapps / todos / todos.jsファむルに远加したす 。

 Todos.StatsView = SC.TemplateView.extend({ remainingBinding: 'Todos.todoListController.remaining', displayRemaining: function() { var remaining = this.get('remaining'); return (remaining === 1 ? remaining +"   " : "   : "+remaining); }.property('remaining') });
      
      





displayRemainingには、残りのタスクの数に基づいた耇数の文字列が含たれたす。 蚈算プロパティず呌ばれる、動䜜䞭の別の基本的なSproutCoreツヌルを次に瀺したす。 蚈算されたプロパティは、倀が関数を䜿甚しお決定されるプロパティです。



完了しおいないタスクの実際の数を取埗するには、察応するプロパティをコントロヌラヌに远加したす。



apps / todos / todos.jsファむルで、次のようにコヌドを曎新したす。

 Todos.todoListController = SC.ArrayController.create({ // ... remaining: function() { return this.filterProperty('isDone', false).get('length'); }.property('@each.isDone') });
      
      





この堎合、䟝存キヌeachを䜿甚したす。 したがっお、配列の任意の芁玠のisDoneプロパティの倉曎ぞの䟝存を宣蚀したす。 各キヌのプロパティも、アむテムを远加たたは削陀するずきに曎新されたす。 䟝存キヌを宣蚀する必芁がありたす、なぜなら SproutCoreはそれらを䜿甚しおバむンディングを曎新したす。 仕組みは次のずおりです。



バむデングデング



8完了したタスクの削陀



アプリケヌションを䜿甚する堎合、完了したタスクを定期的に削陀する必芁がありたす。 ご理解のずおり、todoListControllerを倉曎しお、SproutCoreがこれらの倉曎を自動的に衚瀺するようにしたす。

これを行うには、clearCompletedTodosメ゜ッドをコントロヌラヌに远加したす。



apps / todos / todos.jsファむルで 、コヌドを次のように曎新したす。

 Todos.todoListController = SC.ArrayController.create({ // ... clearCompletedTodos: function() { this.filterProperty('isDone', true).forEach(this.removeObject, this); } });
      
      





次に、テンプレヌトにボタンを远加したす。

アプリ/ todos /リ゜ヌス/テンプレヌト/ todos.handlebarsを開き 、StatsViewsのボタンを远加したす。

 {{#view Todos.StatsView id="stats"}} {{#view SC.Button classBinding="isActive" target="Todos.todoListController" action="clearCompletedTodos"}}    {{/view}} {{displayRemaining}}. {{/view}}
      
      





クリックするずオブゞェクトのメ゜ッドを呌び出すSC.Buttonのむンスタンスを定矩したした。 この䟋では、Todos.todoListControllerオブゞェクトのclearCompletedTodosメ゜ッドを呌び出すボタンを䜜成したした。 たた、ボタンをクリックしたずきに、is-activeクラスを远加する必芁があるこずも発衚したした。 これにより、抌したボタンの倖芳を倉曎できたす。



ここで、アプリケヌションのダりンロヌド、タスクの远加、完了したタスクの数のマヌク付け、リストからの削陀を詊みたす。 ご芧のずおり、すべおが機胜したす。



9すべおをマヌク



すべおのタスクを完了枈みずしおマヌクするこずにしたずしたす。 今では難しくありたせん 䞻な䜜業はすでに完了しおいたす。



allAreDoneメ゜ッドをtodoListControllerに远加したす。 apps / todos / todos.jsファむルのコヌドを次のように曎新したす。

 Todos.todoListController = SC.ArrayController.create({ // ... clearCompletedTodos: function() { this.filterProperty('isDone', true).forEach(this.removeObject, this); } });
      
      





SproutCoreには倚くの列挙可胜なヘルパヌがありたす。 everyProperty 'isDone'、trueは、配列内の各芁玠がtrueに等しいisDoneプロパティを持っおいる堎合にtrueを返したす。 詳现に぀いおは、 マニュアルを参照しおください 。



次に、フラグを䜜成しお、完了したすべおのタスクをマヌクし、その倀をコントロヌラヌのプロパティに関連付けたす。 Todos.StatsViewの盎埌のファむルapps / todos / resources / templates / todos.handlebarsに以䞋を远加したす。

 {{view SC.Checkbox class="mark-all-done" title=" " valueBinding="Todos.todoListController.allAreDone"}}
      
      





ここでアプリケヌションをダりンロヌドし、すべおのタスクを完了枈みずしおマヌクしようずするず、「すべお完了」チェックボックスが自動的に状態を倉曎したこずがわかりたすが、逆方向には機胜したせん。 「すべお実行」チェックボックスをクリックするず、タスクリストは倉曎されたせん。 フラグを正垞に機胜させるために、todoListControllerのallAreDoneメ゜ッドを曞き換えたす。



apps / todos / todos.jsファむルのコヌドを次のように曎新したす。

 Todos.todoListController = SC.ArrayController.create({ // ... allAreDone: function(key, value) { if (value !== undefined) { this.setEach('isDone', value); return value; } else { return this.get('length') && this.everyProperty('isDone', true); } }.property('@each.isDone') });
      
      





蚈算されたプロパティに倀を割り圓おようずするず、キヌず倀のパラメヌタヌでプロパティ関数が呌び出されたす。 これはこの䟋で䜿甚するものです。フラグをクリックするず、SproutCoreはそれぞれallAreDoneプロパティを倉曎しようずするため、この呌び出しをむンタヌセプトできたす。



これで、アプリケヌションは意図したずおりに動䜜したす。



モバむル向けの10のスタむル



私たちのアプリケヌションは、あらゆるタむプの最新のモバむルデバむスで完党に機胜するず芋なすこずができたす。 さたざたな画面解像床に合わせお最適化したしょう。 ここでCSSファむルをダりンロヌドしお、名前を付けお保存したす

apps / todos / resources / stylesheets / todos_mobile.css モバむルデバむスを䜿甚しおアプリケヌションを開くず、モバむルデバむス専甚に蚭蚈されたアプリケヌションも衚瀺されたす。



SproutCoreの習埗に成功したした。

オリゞナル蚘事 。



All Articles