0
function AppViewModel() {
self.tagbuttons=ko.observableArray([
    {shotbar:false, frozendrinks: false, livemusic: false, patio:false, food:false}
    ]);

self.toggleTag = function(data,event) {
    var id = event.target.id;

    self.tagbuttons()[0][id] = !self.tagbuttons()[0][id];
    console.log(self.tagbuttons()[0][id]);
    if(self.tagbuttons()[0][id] == true)
    {
        $(event.target).closest('li').addClass("active");
        console.log(event.target.id+":"+"active");
    }
    else
    {
        $(event.target).closest('li').removeClass("active");
        console.log(event.target.id+":"+"inactive");}
    }
}

ko.applyBindings(new AppViewModel());

私の console.log(self.tagbuttons()[0][id]) は正しいブール値を出力しますが、配列で値が更新されません。これが私のhtmlです:

 <div data-bind="text: tagbuttons()[0].shotbar"></di>
4

2 に答える 2

0

以下は ko ドキュメントからの引用です。

キーポイント: observableArray は、オブジェクトの状態ではなく、配列内にあるオブジェクトを追跡します

オブジェクトを単に observableArray に入れるだけでは、そのオブジェクトのすべてのプロパティ自体が監視可能になるわけではありません。もちろん、必要に応じてこれらのプロパティを監視可能にすることもできますが、それは独立した選択です。observableArray は保持しているオブジェクトを追跡し、オブジェクトが追加または削除されたときにリスナーに通知します。

そのため、配列項目の値を変更している場合、ノックアウトは通知されません。関数を使用valueHasMutatedして、サブスクライバーに手動で通知できます。

self.tagbuttons()[0][id] = !self.tagbuttons()[0][id];
self.tagbuttons.valueHasMutated();

または、次のようにアイテムを配列でラップしますobservalbe

self.tagbuttons = ko.observableArray([
ko.observable({
    shotbar:false, 
    frozendrinks: false, 
    livemusic: false, 
    patio:false, 
    food:false})
    ]);
于 2012-10-27T07:43:58.530 に答える
0

MyAppViewModel を宣言した後、UI が読み込まれた後に、KO バインディングを適用する必要があります。

$(document).ready(function(){
    ko.ApplyBindings(new MyAppViewModel())?  
});

KO バインディングを適用しない限り、ビュー モデルの外部では何も起こりません。

于 2012-10-26T22:23:24.000 に答える