私は完全に立ち往生しています。
静的な可観測配列が与えられた場合:
obj.allRoles = ko.observableArray([
new Role(1, "Adminx"),
new Role(2, "Temp2x"),
new Role(3, "Temp3x")
]);
選択にバインド
<select data-bind="options: allRoles,
optionsText: 'RoleName',
optionsValue: 'RoleId',
optionsCaption: 'Add a new role...',
value: selectedRole">
</select>
クリックバインディングを介して実行される関数:
function addRole() {
alert('got id:' + obj.selectedRole());
var selectedId = obj.selectedRole();
var match = ko.utils.arrayFirst(obj.allRoles(), function (item) {
return item.RoleId == selectedId;
});
alert('got :' + match.RoleName);
return;
}
すべては順調です。最初のアラートは obj.SelectedRole() が選択オプションの値を返すことを示し、2 番目のアラートは一致が見つかり、RoleName が表示されることを示します。ここまではOK。
サービスから移入された静的な監視可能な配列を置き換えると、たとえば次のようになります。
obj.allRoles = ko.observableArray([]);
と
//data
function loadAllRolesFromSvc() {
var url = '/api/UserSvc/GetAllRoles';
$.getJSON(url,
function (data) {
obj.allRoles.removeAll();
var results = ko.observableArray();
ko.mapping.fromJS(data, {}, results);
for (var i = 0; i < results().length; i++) {
var role = new Role();
role.RoleId = results()[i].RoleId;
role.RoleName = results()[i].RoleName;
obj.allRoles.push(role);
};
}
);
};
その後、select が入力されていることがわかりますが、addRole() 関数が実行されると、selectedRole に値が指定されていることが最初のアラートで示されますが、RoleId (addRole() 内) で一致する Role オブジェクトを見つけるコードは失敗します - 一致は常に null です。
どうすればこれを修正できますか? すべてのポインタを歓迎します。
どうもありがとう。