アイテムの配列を持つノックアウトviewModelがあります。すべてのアイテムで1つのプロパティ(選択済み)を監視し、変更されたときにアクションを実行したいと思います。
そのために私はそれを行う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);
});