KoLiteパッケージのdirtyFlagを使用して、オブジェクトのJsプロパティの変更を追跡する



ViewModelオブジェクトの変更を追跡するには、 KoLiteライブラリの一部であるdirtyFlagが役立ちます。これは、新しい機能を追加することでノックアウトの機能を拡張します。











説明



ノックアウト拡張ライブラリパッケージは、 HansFjällemarkJohn Papaの 2人によって作成されました。

ここでソースコードと例を表示します



dirtyFlagを使用してViewModelの変更を検出する例





たとえば、次のViewModelオブジェクトを見てみましょう。



function Vm(){ var user = { name : ko.observable('Alexey'), email : ko.observable('alexey@mail.me'), address : ko.observable('Moskow st. Petrov 12'), awards : ko.observableArray([new Award('silver','The best speaker'), new Award('gold','Brain Storm #2')]) }, dirtyFlag = ko.DirtyFlag(user); return { user : user, dirtyFlag : dirtyFlag, modelStatus : ko.computed(function(){ return dirtyFlag().isDirty() ? "Changes detected" : "No changes"; }), clearDirty : function(){ dirtyFlag().reset(); } } };
      
      







このViewModelはdirtyFlag



プロパティを使用します。このプロパティは、 user



複合プロパティ内の値の変更を追跡します。 ユーザープロパティでどのような追跡が行われるかを示すために、フォームの構築が使用されますko.DirtyFlag(user);



。 モデルをバインドした後、 dirtyFlag



user



プロパティの変更を追跡します。 データの「汚染」のステータスを取得するには、 dirtyFlag().isDirty()



を呼び出す必要があります。 isDirty()は、変更が検出された場合はtrue



返し、 true



ない場合はfalse



返しtrue



。 ユーザーが変更を行ってからデータを元の状態に戻した場合、 isDirtyはfalseを返します。これは、分析されたプロパティの初期状態(つまり、オブジェクトのデータのコピー)を保存するためです。 これは、dirtyFlagコードを見るとはっきりとわかります。



以下に、dirtyFlagの機能を確認できる完全なサンプルコードを示します。



HTMLのサンプルコード
 <div class ="userform" data-bind="with: user"> <h4>Test user information</h4> <label>Name</label> <input type="text" data-bind="value: name"/> <label>E-mail</label> <input type="text" data-bind="value: email"/> <label>Address</label> <input type="text" data-bind="value: address"/> <div class="awards-title"> <h4>Awards:</h4> </div> <div class="userAwardForm" data-bind="foreach: awards"> <div class="userAwardForm"> <label>Type of award:</label> <input type="text" data-bind="value: awardType"> <label>Name of Contest</label> <input type="text" data-bind="value: contestName"> </div> </div> </div> <div class="dirty-status"> <span>Dirty status: </span><a href="#" data-bind="text: modelStatus(), css: {ok : !dirtyFlag().isDirty(), nok : dirtyFlag().isDirty()}" class="modern"></a> </div> <input type="button" class="Button" value="Reset dirty status" data-bind="click: clearDirty">
      
      









JavaScriptのサンプルコード
 $(function() { function Award(atp, contestNamev){ var awardType = ko.observable(atp), contestName = ko.observable(contestNamev); return { awardType : awardType, contestName : contestName } } function Vm(){ var user = { name : ko.observable('Alexey'), email : ko.observable('alexey@mail.me'), address : ko.observable('Moskow st. Petrov 12'), awards : ko.observableArray([new Award('silver','The best speaker'), new Award('gold','Brain Storm #2')]) }, dirtyFlag = ko.DirtyFlag(user); return { user : user, dirtyFlag : dirtyFlag, modelStatus : ko.computed(function(){ return dirtyFlag().isDirty() ? "Changes detected" : "No changes"; }), clearDirty : function(){ dirtyFlag().reset(); } } }; ko.applyBindings(new Vm()); });​
      
      









CSSのサンプルコード
 body{ background-color: #456192 ; margin:20px; } label{ display:block; color: white; } div.userform, div.userAwardForm{ padding: 10px; border: solid white 1px; } div.userAwardForm{ margin-top: 10px; } div.userform h4{ font-weight : bold; font-size:24px; margin-bottom: 15px; color: white; } .awards-title{ margin-top:10px; } .modern { height: 40px; padding: 0 5px; line-height: 40px; font-size: 14px; font-weight: bold; color: white; text-shadow: -1px -1px 0 #333; border-radius: 3px; text-decoration:none; } .ok{ background: -moz-linear-gradient(#84AB69, #334823); background: -webkit-linear-gradient(#84AB69, #334823); -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#84AB69', endColorstr='#334823')"; } .nok{ background: -moz-linear-gradient(#ED3812, #7A1F05); background: -webkit-linear-gradient(#ED3812, #7A1F05); -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#ED3812', endColorstr='#7A1F05')"; } .dirty-status{ height: 50px; } .dirty-status span{ color: white; } .Button { position: relative; cursor: pointer; display: inline-block; border: 1px solid #d5d5d5; text-decoration: none; font: 16px Arial; font-weight: bold; text-align: center; text-shadow:0px 0px 0px #444444; background: #ffffff; padding: 10px 16px; -webkit-border-radius: 10px; -moz-border-radius: 10px; border-radius: 10px; color: #c13737; -moz-box-shadow:inset 0px 0px 0px; -webkit-box-shadow:inset 0px 0px 0px; box-shadow:inset 0px 0px 0px, 0 3px 0 #aeaeae, 0 5px 0 #c13737, 0 8px 0 #aeaeae, 0 10px 6px rgba(0,0,0, .60); } .Button:hover { background: #eeeeee; color: #eb5e7f; -moz-box-shadow:inset 0px 0px 0px; -webkit-box-shadow:inset 0px 0px 0px; box-shadow:inset 0px 0px 0px , 0 3px 0 rgba(235,94,127, .30), 0 3px 0 #aeaeae, 0 5px 5px #eb5e7f, 0 5px 0 #eb5e7f, 0 8px 0 rgba(235,94,127, .15), 0 8px 0 #aeaeae, 0 10px 6px rgba(0,0,0, .60); } .Button:active { transform: translateY(2px); -moz-transform: translateY(2px); -ms-transform: translateY(2px); -o-transform: translateY(2px); -webkit-transform: translateY(2px); -moz-box-shadow:inset 0px 0px 0px; -webkit-box-shadow:inset 0px 0px 0px; box-shadow:inset 0px 0px 0px, 0 3px 0 rgba(235,94,127, .30), 0 3px 0 #eeeeee, 0 5px 5px rgba(#eb5e7f, .65), 0 5px 0 #eb5e7f, 0 6px 0 rgba(235,94,127, .15), 0 6px 0 #eeeeee, 0 6px 6px rgba(0,0,0, .65); }
      
      









この例では、指示として、「変更なし」-変更が検出されない場合、および「変更が検出された」-変更が見つかった場合、碑文が表示されます。 また、背景の変更が行われ、表示のために碑文が表示されます。



「ダーティステータスのリセット」ボタンは、 dirtyFlag ViewModelプロパティのreset



メソッドを示すサンプルフォームにあります。 現在の変更を基本として受け入れるには、 dirtyFlag().reset();



を呼び出す必要がありdirtyFlag().reset();







おわりに





このライブラリは、ViewModelの必要なプロパティの変更を簡単に追跡するのに役立つと思います。







ご清聴ありがとうございました!



PS私は投稿のために自分で絵を描きました:)



All Articles