我對KO(開始2天后)比較陌生,正在嘗試一些簡單的示例。目前,我對這段代碼有問題。Knockoutjs在這種情況下不更新UI
<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'));
基本上該應用採取單個輸入(年齡)。我正在使用可寫計算observable解析輸入到INTEGER和解析後,如果它的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不同步。
這是因爲我做錯了嗎?
你應該考慮使用[淘汰賽驗證] (https://開頭github上。com/ericmbarnard/Knockout-Validation)插件。 – 2013-03-26 21:51:08