0

subscribeメソッド内でobservableの値を読み取ろうとしていますが、値(trueまたはfalse)ではなく、常にオブジェクトが返されます。

以下のフィドルまたはコードを確認してください:http: //jsfiddle.net/StrandedPirate/WP3s9/

必要なのは、observableArray内の1つのアイテムだけで、一度にisSelectedプロパティをtrueに設定することです。ループやサブスクリプションなしでこれを行う別の方法がある場合は私に知らせてください、しかしこれは私が終わったということです。

var menuViewModel = (function () {
    function _constructor(error, details) {
        var self = this;
        self.items = ko.observableArray();

        // add the menu items
        self.items.push(new menuItemModel("Dashboard"));
        self.items.push(new menuItemModel("Content Management"));

        self.handleIsSelectedChange = function (item) {
            // issue: item.isSelected() returns [object Object] instead of true/false
            console.log("inside subscription function: " + item.title() + ", isSelected: " + item.isSelected());

            // this fails because it doesn't return true/false it returns returns [object Object]
            if (item.isSelected() === true) {
                console.log("subscription fired: " + item.title());
                // de-select all other items
                ko.utils.arrayForEach(self.items(), function (subItem) {
                    if (subItem.title() !== item.title()) {
                        console.log("deselecting: " + subItem.title());
                        subItem.isSelected(false);
                    }
                });
            }
        };

        self.subscribeToItems = function () {
            console.log("subscribeToItems called");
            ko.utils.arrayForEach(self.items(), function (item) {
                console.log("title: " + item.title() + ", isSelected: " + item.isSelected());
                item.isSelected.subscribe(function (currentItem) {
                    self.handleIsSelectedChange(currentItem);
                });
            });
        };
    };

    return _constructor;
})();

var menuItemModel = (function () {
    function _constructor(title, icon) {
        var self = this;
        self.title = ko.observable(title || "");
        self.icon = ko.observable(icon || "");
        self.isSelected = ko.observable(false);
    };
    return _constructor;
})();


var menuVM = new menuViewModel();
menuVM.subscribeToItems();
ko.applyBindings(menuVM, $(".mainMenu").get(0));
4

1 に答える 1

1

に対してバインドするとclick: isSelected、関数が呼び出され、現在のデータ項目が最初の引数として渡されます。

は監視可能であるためisSelected、最初の項目を渡すとその値に設定されます。したがって、isSelectedオブジェクト自体になります。

toggleSelectedアイテムに関数を作成することをお勧めしますthis.isSelected(!this.isSelected())

サブスクリプションには新しい値が渡されるため、この場合はtrue / falseですが、アイテム自体を操作したいようです。

これは、サブスクリプションがトリガーされたときにアイテムをハンドラーに渡すサンプルです。

http://jsfiddle.net/rniemeyer/WP3s9/31/

別のオプションは、ハンドラーのコンテキストをアイテムに設定し、thisハンドラーで使用することです。次のようなもの:http://jsfiddle.net/rniemeyer/WP3s9/32/

于 2012-11-10T13:46:20.250 に答える