ViewModelオブジェクトの変更を追跡するには、 KoLiteライブラリの一部であるdirtyFlagが役立ちます。これは、新しい機能を追加することでノックアウトの機能を拡張します。
- dirtyFlag-個々のViewModelプロパティと集計ViewModelプロパティの両方の変更を追跡するように設計されています
- asyncCommand-非同期コマンドを実行するように設計されています
- アクティビティ - アクティビティを示すように設計されています。 asyncCommandと組み合わせて使用
説明
ノックアウト拡張ライブラリパッケージは、 HansFjällemarkとJohn 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私は投稿のために自分で絵を描きました:)