我试图在其内部的订阅方法中读取observable的值,它总是返回一个对象而不是值(true或false)。
查看小提琴或下面的代码: http://jsfiddle.net/StrandedPirate/WP3s9/
我想要的只是observableArray中的一个项目,一次将 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));
答案 0 :(得分: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/