Показывать текст внешнего ключа в jqGrid - PullRequest
0 голосов
/ 30 мая 2011

У меня есть jqGrid, который я связываю с источником данных JSON (веб-сервис WCF). Метод WCF возвращает список идентификаторов. Ниже приведен пример возвращаемого JSON. Как видите, это отношение пользователя к ветви с ролью, т. Е. У пользователя могут быть разные роли в разных ветвях.

    [{"entityHashCode":null,"BranchId":25,"SysRoleId":1,"SysUserId":1},
{"entityHashCode":null,"BranchId":25,"SysRoleId":2,"SysUserId":1},
{"entityHashCode":null,"BranchId":26,"SysRoleId":1,"SysUserId":1]

Отображение этих данных в jqGrid - это нормально, но, очевидно, я хочу показать пользователю имена ветвей и ролей, а не их идентификаторы. К сожалению, изменение WCF таким образом, чтобы он возвращал данные как JOINS, не является опцией, поскольку метод WCF может не измениться.

У меня также есть доступ к 2 методам веб-службы GetBranches и GetRoles, которые возвращают массивы с полными деталями - мне нужно javascript-массивы, в которых я храню эту информацию.

Есть ли способ, с помощью которого я могу сказать jqGrid привязаться к моему исходному массиву, но каким-то образом сказать ему, чтобы он получал имена ветвей и ролей из разных источников данных (массивов GetBranches и GetRoles)?

Ответы [ 2 ]

0 голосов
/ 01 июня 2011

Я согласен с тем, что у меня были разговоры с LeftyX, в jqGrid не существует родного способа сделать это, поэтому я создал метод для "JOIN" между объектами в массиве.Функция выглядит следующим образом:

function joinJSONFK (entities, fkProperties, fkLookupArrays) {

    function findValInAry(ary, idfield, value) {
        for (var i = 0; i < ary.length; i++) {
            if (value == ary[i][idfield]) {
                return ary[i];
            }
        }
        return null;
    };

    function applyFKProperties(entity, fkProperties, fkLookupArrays) {
        for (var i = 0; i < fkProperties.length; i++) {
            entity[fkProperties[i] + "Source"] = findValInAry(fkLookupArrays[i], fkProperties[i], entity[fkProperties[i]]);
        }
        return entity;
    }

    var entityary = [];
    if (!entities instanceof Array) {
        entities = applyFKProperties(entities);
        return entities[0];
    }
    else {
        for (var i = 0; i < entities.length; i++) {
            entities[i] = applyFKProperties(entities[i], fkProperties, fkLookupArrays);
        }
        return entities;
    }
}

Вы могли бы использовать его следующим образом:

userRoleData = joinJSONFK(result, ["SysRoleId", "BranchId"], [GlobalRoles, GlobalBranches]); 

Где «result» - это массив объектов JSON в следующем формате:

[{"entityHashCode":null,"BranchId":25,"SysRoleId":1,"SysUserId":1},
{"entityHashCode":null,"BranchId":25,"SysRoleId":2,"SysUserId":1},
{"entityHashCode":null,"BranchId":26,"SysRoleId":1,"SysUserId":1]

И ["SysRoleId", "BranchId"] - это массив внешних ключей, которые должны быть "JOINED", а [GlobalRoles, GlobalBranches] - это массив, содержащий данные "поиска" для внешних ключей.

GlobalRoles будет выглядеть примерно так:

[{"Name":"Admin","SysRoleId":1,"Description":"Some description"},
{"Name":"Role 2","SysRoleId":2,"Description":"Some description"},
{"Name":"A new role","SysRoleId":3,"Description":"Some description"},
{"Name":"Another Role","SysRoleId":4,"Description":"Some description"}]

А GlobalBranches будет выглядеть примерно так:

[{"BranchName":"Branch 25","BranchId":25,"Description":"describe the branch"},
{"BranchName":"Branch 26","BranchId":26,"Description":"describe the branch"},
{"BranchName":"Branch 27","BranchId":27,"Description":"describe the branch"}]

После вызова функции "userRoleData" будет выглядеть какчто-то вроде этого:

[{"entityHashCode":null,"BranchId":25,"SysRoleId":1,"SysUserId":1, "SysRoleIdSource":{"Name":"Admin","SysRoleId":1,"Description":"Some description"}, "BranchIdSource":{"BranchName":"Branch 25","BranchId":25,"Description":"describe the branch"}},
{"entityHashCode":null,"BranchId":25,"SysRoleId":2,"SysUserId":1}, "SysRoleIdSource":{"Name":"Role 2","SysRoleId":2,"Description":"Some description"}, "BranchIdSource":{"BranchName":"Branch 25","BranchId":25,"Description":"describe the branch"}},
{"entityHashCode":null,"BranchId":26,"SysRoleId":1,"SysUserId":1, "SysRoleIdSource":{"Name":"Admin","SysRoleId":1,"Description":"Some description"}, "BranchIdSource":{"BranchName":"Branch 26","BranchId":26,"Description":"describe the branch"}}]

Таким образом, есть хорошо структурированная коллекция объектов.

0 голосов
/ 30 мая 2011

Почему бы вам просто не вызвать GetBranches и GetRoles в вашем WCF методе и построить все совпадения (отношения), генерируя новый объект массива (List of), который содержит BranchId, BranchName, SysRoleId, SysRoleName, SysUserId
Вы можете вернуть свой новый список jqGrid всего одним вызовом. Это было бы быстрее и проще в реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...