私はKO(2日前に開始)に比較的慣れておらず、いくつかの簡単な例を試していました。現在、このコードに問題があります。
<div id="idChangeStyle">
<span data-bind="style: { background: GetAge() < 18 ? 'red':'white'}">Enter Your Age:</span>
<input type="text" data-bind="value: GetAge"></input>
</div>
function ageViewModel() {
var self = this;
self.age = ko.observable(18);
self.GetAge = ko.computed({
read: function () {
return self.age();
},
write: function (value) {
value = parseInt(String(value).replace(/[^\d]/g, ""));
if (isNaN(value))
self.age(18);
else
self.age(value);
}
});
};
ko.applyBindings(new ageViewModel(), document.getElementById('idChangeStyle'));
基本的に、アプリは単一の入力(年齢)を取ります。INTEGERへの入力を解析するために書き込み可能な計算されたobservableを使用しており、そのNaNを解析した後、年齢をデフォルト値、つまり18に設定しようとしています。また、HTMLに単純なロジックがあり、スパンの背景を赤に変更しています。年齢が18歳未満の場合。
通常の場合は正常に動作しますが、問題が発生した場合は次のようになります。-
Case 1:
Current Input: 18 (initial case)
enter *4* then tab //works
enter *a* then tab //work (defaults to 18)
enter *a* then tab //doesn't work
case 2:
current input: 18
enter *a *then tab* //*doesn't work
ノックアウトのコードをチェックして、次のコードを実行した場合に何が起こるかを確認しました:-
if(isNaN(value))
self.age(18);
..次の行で:-
// Ignore writes if the value hasn't changed
if ((!observable['equalityComparer']) || !observable['equalityComparer'](_latestValue, arguments[0])) {
_latestValue
との両方がarguments[0]
同じ値(18)であるため、何も実行されません。年齢の値が変更されていないため、viewmodelプロパティとUIが同期していません。
これは私が間違っているからですか?