2013-04-17 67 views
3

採用淘汰賽即時通訊與HTML組合選擇/選項(參見Fiddle):使淘汰賽applyBindings治療選擇的選項數量

<select data-bind="value: Width"> 
    <option>10</option> 
    <option>100</option> 
</select> 

當調用applyBindings這個選項被視爲字符串。這導致不希望的影響。考慮下面的示例:

function AreaViewModel() { 
    var self = this; 

    self.Width = ko.observable(10); 
    self.Height = ko.observable(10); 

    self.Area = ko.computed(function() { 
     return self.Width() * self.Height(); 
    }); 
} 

$(document).ready(function() { 
    var viewModel = new AreaViewModel(); 

    ko.applyBindings(viewModel); 
}); 

applyBindings被調用,self.Widthself.Height從它們的初始值10爲「10」,這導致了計算功能的重新評估類型強制轉換。

這似乎不是什麼大問題,但在更復雜的解決方案中,我有一個PageSize屬性(100/500/1000每頁行數),當該屬性發生更改時,會導致多個AJAX調用。

哪個(花哨的)解決方案可以解決這個問題?

+1

結帳http://stackoverflow.com/questions/7395946/knockout-js-json-has-numeric-but-knockout-changes-it-to-string-any-suggestions – Luffy

+0

是的,那就是我錯過的。謝謝。 – Dresel

回答

1

可以使寬度計算,寫自己的「寫」和「讀」這樣的選項:

var _width = ko.observable(10); 
self.Width = ko.computed({ 
    read : function(){ 
    return _width; 
    }, 
    write: function(value){ 
    if(typeof value === "string"){ 
     _width(parseInt(value)); 
    } 
    } 
+0

我會堅持推薦你的建議(類似於http://stackoverflow.com/a/7396039/1249506)。謝謝。 – Dresel

2

你可以嘗試像

self.Width = ko.observable(10); 
self.Width.subscribe(function(newValue){ 
    if(typeof newValue === "string"){ 
     self.Width(parseInt(newValue)); 
    } 
}); 
+0

這對我有用。乾杯。 – Aeptitude