我有一個項目數組的knockout viewModel。我想觀看所有項目中的一個屬性(選定),並在更改時採取行動。淘汰賽訂閱功能關閉未捕獲
爲此我有一個可以做到這一點的SectionManager。我初始化經理併爲每個項目設置訂閱。 myid
關閉不被捕獲,它總是3
,最後一個值。有人可以告訴我我失去了什麼嗎?
示例:如果您單擊列表中的某個項目,星號將指示它是否被選中。這樣可行。訂閱的功能也被調用,並且myid
被寫入到控制檯,但這總是3
。
約翰
HTML:
<!DOCTYPE html>
<html>
<head>
<title></title>
<script type="text/javascript" src="Scripts/jquery-1.7.2.js"></script>
<script type="text/javascript" src="Scripts/knockout-2.1.0.debug.js"></script>
<script type="text/javascript" src="test.js"></script>
</head>
<body>
<ul data-bind="foreach: roles">
<li data-bind="click: toggle">
<span data-bind="text: id"></span>
<span data-bind="visible: selected">*</span>
</li>
</ul>
</body>
</html>
與此腳本:
var roles = [
{ id: 1 },
{ id: 2, selected: true },
{ id: 3 }
];
var viewModel = (function (roles) {
var obj = {};
var arr = [];
for (var i = 0; i < roles.length; i++) {
arr.push({
id: roles[i].id,
selected: ko.observable(roles[i].selected || false),
toggle: function() {
this.selected(!this.selected());
}
});
}
obj.roles = ko.observable(arr);
return obj;
})(roles);
var sectionManager=(function(){
return {
init: function (roles) {
for (var i = 0; i < roles.length; i++) {
var item = roles[i];
var myid = item.id;
item.selected.subscribe(function() {
console.log(myid); // ALWAYS 3!!
});
}
}
};
})();
$(function() {
sectionManager.init(viewModel.roles());
ko.applyBindings(viewModel);
});
這確實是這個特定情況下的正確答案。感謝你的鏈接,一個更通用的解決方案(不依賴'this'但修復閉包)將使用var subscriber = function(id){return function(){console.log(id); }; }; item.selected.subscribe(訂戶(本身份識別碼));如果您同意,也可以將其添加到您的答案中。 – 2012-08-17 06:02:49
我使用備用解決方案更新了答案。在Knockout的情況下,我仍然建議將其綁定到您的數據項。它更簡單,併爲您提供處理物品多個屬性的靈活性。理解和控制'this'的價值是Knockout中的一個重要概念。謝謝。 – 2012-08-17 13:01:32
我明白,如果它只是在訂閱中需要的可觀察性,那就是它。但是我還需要其他信息(可觀察範圍外),因此需要一個新的範圍。在這種情況下,這個例子過於簡單化了,爲此感到遺憾。 – 2012-08-17 15:00:00