我有一个带有一系列项目的淘汰视图模型。我想查看所有项目的一个属性(选定)并在它发生更改时采取行动。
为此,我有一个 SectionManager 可以做到这一点。我初始化管理器并为每个项目设置订阅。没有捕获闭包,myid
它始终3
是最后一个值。有人能告诉我我在哪里丢的吗?
示例:如果您单击列表中的某个项目,星号将指示它是否被选中。这样可行。subscribed 函数也被调用,并且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);
});