Titaniumのモデルずコレクションに぀いお知りたいこずすべお

しかし、䜕らかの理由で圌らは尋ねるこずを恐れおいたした。



モデルはアプリケヌションの非垞に重芁な郚分です。デヌタがなければどこにも存圚しないからです。



この蚘事では、モバむルアプリケヌションAppcelerator Titaniumの開発のためのMVCフレヌムワヌクでのモデルの䜿甚のあらゆる偎面を可胜な限り詳现にカバヌするようにしたす。



モデルぞの連絡を詊みおいない堎合は、この蚘事が数キロの神経を節玄するこずを願っおいたす。



Backbone.js



したがっお、Titaniumでモデルを操䜜するずきに最初に知っおおくべきこずは、それらがBackboneのモデルずコレクションに基づいおいるずいうこずです。 これは、たず、Backboneのドキュメントで説明されおいるすべおのプロパティずメ゜ッドを䜿甚できるこずを意味したす。 第二に、あなたがただそうしおいなければ、最初に圌女を知るこずは䞍必芁ではありたせん。



念のため、甚語に焊点を圓おたす。モデルは単䞀の゚ンティティであり、コレクションは類䌌したモデルのセットです。



重芁TitaniumはBackboneバヌゞョン0.9.2を䜿甚するため、Backboneドキュメントの䞀郚のメ゜ッドが実装されない堎合がありたす。


Underscore.js



コレクションはUnderscore.jsメ゜ッドも継承し、開発者の䜜業を楜にしたす。 たずえば、 .mapメ゜ッド



䜜成



2぀の同等の方法でモデルを䜜成できたす。AppceleratorStudioを䜿甚する方法ず手動で行う方法です。

<project> / app / models /フォルダヌに特別な圢匏のファむルを手動で䜜成できたす実際には、スタゞオによっお自動的に䜜成されたす。

モデル蚘述ファむル圢匏


exports.definition = { config : { //   }, extendModel: function(Model) { _.extend(Model.prototype, { //  Backbone.Model }); return Model; }, extendCollection: function(Collection) { _.extend(Collection.prototype, { //  Backbone.Collection }); return Collection; } }
      
      







スタゞオのヘルプを䜿甚する堎合は、プロゞェクトのコンテキストメニュヌを呌び出しお、「新芏->合金モデル」の項目を遞択するだけです。 ダむアログボックスを䜜成するずき、アダプタのタむプを遞択するように求められたすlocalStorage、properties、たたはsql。 アダプタヌのタむプに぀いお以䞋に説明したす。



基本的な機胜のためにこのファむルに蚘述する必芁があるのは、構成ブロックだけです。 デヌタスキヌマず同期アダプタヌのタむプが含たれおいたす。 このブロックには、次のフィヌルドが含たれおいる必芁がありたす。



たずえば、曞籍モデルを䜜成したす。 これを行うには、<project> / app / models /フォルダヌにbooks.jsファむルを䜜成したす。

䜜成されたモデルの䟋


 exports.definition = { config: { "columns": { "title": "String", "author": "String" //    sql,     SQLite keywords  }, "defaults": { "title": "-", "author": "-" }, "adapter": { "type": "sql", "collection_name": "books", "idAttribute" : "title", "db_file" : "db_books", //   ,    .   _alloy_ "db_name" : "books.sqlite", //      /app/assets.   ,    [_].sqlite } } }
      
      







ここには、本の名前ず著者の2぀のテキストフィヌルドを持぀モデルがありたす。 䞡方のフィヌルドのデフォルトは「-」です。 これたでのずころ、すべおがシンプルです。



sqlアダプタヌタむプは、デヌタを取埗しようずするずきに、組み蟌みアダプタヌを䜿甚するモデルがデバむス䞊のSQLiteデヌタベヌスに接続し、booksテヌブルからデヌタを取埗しようずするこずを瀺したす。

モデル内の独自のプロパティずメ゜ッドは、次のように远加できたす。

モデル拡匵の䟋


 exports.definition = { config : { //   }, extendModel: function(Model) { _.extend(Model.prototype, { //  Backbone.Model customProperty: 'book', customFunction: function() { Ti.API.info(',  '); }, }); return Model; } }
      
      







コレクションにも同じこずが蚀えたす。 extendModelに独自のメ゜ッドを远加した堎合、モデルで䜿甚できたすが、コレクションは䜿甚できたせん。逆の堎合も同様です。



䜿甚する



モデル/コレクションにアクセスするには、2぀の方法がありたす。



グロヌバルシングルトン



この堎合、モデルはどこでも、すべおのコントロヌラヌですぐに䜿甚できたす。 すでに宣蚀されおいる堎合は、別の宣蚀でAlloy.Models.instanceメ゜ッドを呌び出すず、この宣蚀されたモデルぞのリンクが返されたす。 䟋はナヌザヌモデルです;それはどこでも単独である堎合もありたす。



コレクションに぀いおも同様です。



ロヌカルリンク



Alloy.createModelメ゜ッドを䜿甚しお、ロヌカルリンクを䜜成できたす。 このモデルは、䜜成されたコントロヌラヌ内でのみ䜿甚可胜になりたす。 メ゜ッドはファクトリヌであり、モデル名ファむル名から.jsを匕いたものずパラメヌタヌを枡したす。 そしおそれだけです。



コレクションに぀いおも同様です。



XML



<Model>マヌクアップ芁玠は、 <Alloy>の盎接の子孫でなければなりたせん。 たた、倀が「model-file-name-minus-.js」のsrc属性が必芁です。 次に、Alloy.Models名前空間のこのモデルのシングルトンがコントロヌラヌで䜿甚可胜になりたす。

XML


 <Alloy> <Model src="book" /> <Window> <TableView id="table" /> </Window> </Alloy>
      
      







コントロヌラヌ


 var drama = Alloy.Models.book; drama.set('title', '  '); drama.set('author', ' ');
      
      







この芁玠にはむンスタンス属性もありたす。 trueの堎合、モデルぞのリンクが䜜成されたすロヌカル、1぀のコントロヌラヌ内でのみ䜿甚可胜。 ずころで、この堎合、モデルはAlloy.Models名前空間ではアクセスできたせん。IDでアクセスする必芁がありたす。

XML


 <Alloy> <Model id="myBook" src="book" instance="true"/> <Window> <TableView id="table" /> </Window> </Alloy>
      
      







コントロヌラヌ


 var drama = $.myBook; drama.set('title', '  '); drama.set('author', ' ');
      
      







コレクションに぀いおも同様です。



同期アダプタヌ



最埌に、「䜜成」セクションで玄束されたセクションに行きたした。 モデルを操䜜するには、デヌタスキヌマを蚘述するだけでは䞍十分です。 たた、それらを䜕かに接続する必芁がありたす。 この接続は同期アダプタヌです。

アダプタは、Backbone.syncの実装です。 最も䞀般的なタスクはリモヌトサヌバヌでのCRUD操䜜であるため個人的には私の経隓から、デフォルトでは、Backbone.syncメ゜ッドは、Model.urlRootおよびCollection.urlプロパティで指定したアドレスに察しおRESTful JSONリク゚ストを行いたす。 これは公匏ドキュメントです。 実際には、モデル/コレクションの感芚を぀かむために、restapiアダプタヌを䜿甚するず非垞に䟿利です。これに぀いおは埌で説明したす。 それたでの間、公匏ドキュメントに戻りたす。



アダプタには次の4぀のタむプがありたす。





SQL



idAttributeキヌがadapterセクションのconfigセクションで定矩されおいない堎合、AlloyはテヌブルにAlloy_idフィヌルドを生成し、それを䞻キヌずしお䜿甚したす。



db_fileおよびdb_name構成フィヌルド「䜜成」セクションに泚意しおください。 ここで重芁です。

他のタむプずは異なり、このメ゜ッドでは、 Backbone.Collection.fetchは1行のSQLク゚リを取埗できたす。

.fetchのク゚リ文字列
 var library = Alloy.createCollection('book'); //   -  collection_name   var table = library.config.adapter.collection_name; //   library.fetch({query:'SELECT * from ' + table + ' where author="' + searchAuthor + '"'}); // prepared statement library.fetch({query: { statement: 'SELECT * from ' + table + ' where author = ?', params: [searchAuthor] }});
      
      







぀たり、単玔なリク゚ストが必芁な堎合は、パラメヌタにク゚リキヌを指定しおオブゞェクトを枡し、耇雑なリク゚ストが必芁な堎合は、リク゚ストずパラメヌタの䞡方を枡したす。



ずころで、ただidキヌを枡すこずができたす。 この堎合、アダプタヌ自䜓はWHERE id =..制玄を䜿甚するこずを理解したす。

id
 myModel.fetch({id: 123}); //   ,  myModel.fetch({query: 'select * from ... where id = ' + 123 });
      
      









物性



デヌタベヌスがSQLiteでない堎合、独自のアダプタヌを䜜成し、デヌタを䜿甚しお䜕でもできたす。 これを行うには、app / assets / Alloy / syncたたはapp / lib / Alloy / syncディレクトリにアダプタヌファむルmyAdapter.jsなどを䜜成し、adapter.typeのモデル構成でこのファむルの名前、぀たり「myAdapter」を指定したす。

実際、このファむルは3぀の関数を゚クスポヌトする必芁がありたす。





レスタピ



リモヌトサヌバヌからデヌタを受信する必芁があり、独自のアダプタヌを䜜成したくない堎合は、組み蟌みのアダプタヌの数には含たれおいないが、その仕事RESTful JSONリク゚ストを実行する玠晎らしいrestapiアダプタヌがありたす。

最䜎限必芁な蚭定-構成のURLフィヌルド

Restapiアダプタヌを䜿甚したモデルの䟋
 exports.definition = { config: { "URL": "http://example.com/api/modelname", //"debug": 1, "adapter": { "type": "restapi", "collection_name": "MyCollection", "idAttribute": "id" } }, extendModel: function(Model) { _.extend(Model.prototype, {}); return Model; }, extendCollection: function(Collection) { _.extend(Collection.prototype, {}); return Collection; } }
      
      







もちろん、これらはすべお利甚可胜な蚭定ではありたせん;完党なリストに぀いおは、ドキュメントを参照しおください。 このアダプタヌで他に重芁なこずは、そのフェッチメ゜ッドが3぀の可胜なフィヌルドを持぀蟞曞を受け入れるこずです。





おわりに



したがっお、これは基本レベルでTitaniumのモデルを操䜜できるようにするために知っおおく必芁があるすべおです。 このトピックはやや広範です。たずえば、デヌタベヌスの異なるバヌゞョン間の移行プロセス、デヌタバむンディング、Alloyを䜿甚しないモデルの䜿甚、SQLiteでの䜜業の説明をここでは意図的に省略したした。 次の蚘事でこれらすべおのギャップを埋めたいず思っおいたす。ご期埅ください。



この蚘事は、a公匏文曞に基づいおいたす。 bAlloyでモデルを䜿甚した経隓。 habrasocietyの䞭に、私よりもこの問題をよく理解しおいお、間違いや䞍正確なものを芋おいる人がいるなら、コメントしお議論しおください。



All Articles