0

私は完全に立ち往生しています。

静的な可観測配列が与えられた場合:

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 です。

どうすればこれを修正できますか? すべてのポインタを歓迎します。

どうもありがとう。

4

1 に答える 1

0

クラスのプロパティは監視できないRoleIdと思いますが、関数では監視できるように設定します。RoleNameRoleloadAllRolesFromSvc

このコードko.mapping.fromJS(data, {}, results);は、結果内のすべてのプロパティを observableArray および observable に変換します。本当に、なぜ結果を観測可能に変換するのかわかりません。したがって、問題を解決するには、マッピングを削除できます。

   function loadAllRolesFromSvc() {
        var url = '/api/UserSvc/GetAllRoles';
        $.getJSON(url,
            function (data) {
                obj.allRoles.removeAll();

                for (var i = 0; i < data.length; i++) {                        
                    var role = new Role();
                    role.RoleId = data[i].RoleId;
                    role.RoleName = data[i].RoleName;
                    obj.allRoles.push(role);                        
                };
            }
        );
    };

RoleIdまたは、ラップを解除して値を指定することもできRoleNameます:

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);                        
            };
        }
    );
};
于 2012-12-21T12:39:52.737 に答える