この記事は古くなっています。 新しいドキュメントには、この投稿から最も関連する情報が含まれています。 Matreshka.Objectを参照してください。前回の記事で、マトリョーシカの一般原則、つまり要素、イベント、継承のバインドについて説明しました。 前回の記事の最後で、「アプリケーションの状態(ユーザーにパスワードを表示するかどうか)とアプリケーションデータ(ログイン、パスワード、 "remember me")を区別する方法」を自問しました。
これに役立つクラスは、
Matreshka
クラスを継承する
MK.Object
と呼ばれます。 考え方は簡単です。クラスインスタンスのデータを担当するキーが多数あり、他のプロパティはアプリケーションの状態のみを担当し、ビジネスモデルではないと考えています。
いくつのキーが機能するか多くのキーについては、疑似._keys
プロパティ._keys
。これは、私たちにとって重要ではない値を持つオブジェクトです。 新しいキーを追加する前に、キーが配列内にあるかどうかを確認する必要があり、削除するときにはインデックスを見つけて次の要素をシフトする必要があるため、配列は私たちには適していません。 オブジェクトの場合、行の完全なセットを取得し、その存在を確認する必要のない新しいキーを追加し、 delete
はdelete
演算子を呼び出すだけで済みます。
データを処理するプロパティを設定するために、
.jset
メソッドが
.jset
ます:
var mkObject = new MK.Object(); mkObject.jset( 'a', 1 ); console.log( mkObject.toJSON() );
.jsetのドキュメント:
finom.imtqy.com/matreshka/docs/Matreshka.Object.html#jset.ToJSONドキュメント :
finom.imtqy.com/matreshka/docs/Matreshka.Object.html#toJSONこれで、通常どおり新しいプロパティを使用できます。
var mkObject = new MK.Object(); mkObject.jset( 'a', 1 ); mkObject.a = 2; console.log( mkObject.toJSON() );
特に、
Matreshka
クラスから継承したメソッドを使用できます。
mkObject.bindNode( 'a', '.my-element' ); mkObject.on( 'change:a', handler );
.toJSON
メソッドの結果として、キーをキーのセットに追加せずにプロパティを設定した場合
.toJSON
このプロパティは表示されません。
var mkObject = new MK.Object(); mkObject.jset( 'a', 1 ); mkObject.b = 3; console.log( mkObject.toJSON() );
.addJSONKeys
メソッドを使用して、キーリストにキーを追加できます。
Doc:
finom.imtqy.com/matreshka/docs/Matreshka.Object.html#addJSONKeys mkObject.addJSONKeys( 'b', 'c' );
ここで重要なルールがあります。どのプロパティを
.toJSON
関数の結果に含めるべきかわからない場合、通常の割り当ての代わりに常に
.jset
を使用します。 キーがわかっている場合、個人的には、デフォルトのデータを常に設定することを好みます。
var MyClass = Class({ 'extends': MK.Object, constructor: function( data ) { this .initMK() .jset({
.initMK
呼び出しに注意して
.initMK
。 ここで、彼はイベントオブジェクトと「特別な」プロパティだけでなく、キーのオブジェクトセットも初期化します。 さらに、必要なイベントハンドラーを追加して、データが変更されたときに
"modify"
イベントを発生させます。 例:
var mkObject = new MK.Object(); mkObject.jset({ a: 1, b: 2 }); mkObject.c = 3; mkObject.on( 'modify', function() { alert( 'Data is changed' ); }); mkObject.a = 4;
引数をオブジェクトとしてクラスに渡すと、データとして解釈されます。
var mkObject = new MK.Object({ a: 1, b: 2 });
.each
メソッドを使用してデータを反復処理できます。
var mkObject = new MK.Object(); mkObject.jset({ a: 1, b: 2 }); mkObject.c = 3; mkObject.each( function( item, key ) { console.log( key ); });
Doc:
finom.imtqy.com/matreshka/docs/Matreshka.Object.html#each.hasOwnProperty
メソッドを使用して、オブジェクトにプロパティがあるかどうかを確認できます
var mkObject = new MK.Object(); mkObject.jset( 'a', 1 ); mkObject.b = 2; alert( mkObject.hasOwnProperty( 'a' ) );
これにより、通常のオブジェクトと同様に
for..in
構造を使用できます。
for( var i in mk ) if( mk.hasOwnProperty( i ) ) { doSomething(i, mk[i]) }
UPD :
Object.defineProperty
制限のため、8番目のロバでは機能しません
名前がそれ自体を物語っている多くのメソッドがあります:
.keyOf
。値でキーを検索し、キーを返します(配列の
.indexOf
に類似)。
キーの配列を返す
.keys
。
.removeJSONKeys
、データを処理するキーのセットからキーを削除します。
前の記事から修正された例を
ご覧ください:
jsbin.com/disigiza/1/editコンストラクターで、デフォルトのデータを設定します。
... constructor: function () { this .initMK() .jset({
そして、サーバーに送信するオブジェクトを手動で作成する代わりに、
.toJSON
メソッドを呼び出します。
... login: function () { if (this.isValid) { alert( JSON.stringify( this.toJSON() ) ); } return this; } ...
結論として
これで、マトリョーシカのデータを、バックエンドにとって関心のない状態から分離する方法がわかりました。 いいね しかし、大量のデータが必要な場合はどうでしょうか? Backbone.jsの配列またはコレクションのようなもの。 解決策は
MK.Array
クラスです。これについては、次の記事で説明します。
最後まで読んでいただきありがとうございます。 すべて良いと良いコーディング。