Angular ui-grid - выбор DropDown показывает идентификатор

Я использую Angular http://ui-grid.info/. Столкнувшись с проблемами, когда у меня есть раскрывающийся список в сетке.

Следующий код, который я использовал для DropDown: -

objCombos = $scope.getComboValues('DEPARTMENT');

$scope.gridOptions.columnDefs.push({
field: fieldName.toUpperCase(), displayName: displayName,
columnType: 'columnDb',
editableCellTemplate: 'ui-grid/dropdownEditor',
editDropdownValueLabel: 'DEPARTMENT',
editDropdownOptionsArray: objCombos,
name: fieldName.toUpperCase()
});

Массив для DropDown выглядит так objCombos :-

[
    { id: 1, department: 'Branch1' },
    { id: 2, department: 'Branch2' }
];

Когда я выбираю и изменяю значение раскрывающегося списка, скажем, с Branch1 на Branch2, после изменения значения отображается id выбранного значения в раскрывающемся списке, в данном случае 2.

введите здесь описание изображения


person Anup    schedule 31.12.2014    source источник
comment
Так в чем твой вопрос?   -  person simeg    schedule 31.12.2014
comment
Проблема в том, почему после выбора в DropDown вместо значения отображается id.   -  person Anup    schedule 31.12.2014


Ответы (2)


Установка editDropdownIdLabel в соответствии с editDropdownValueLabel подходит для случаев, когда идентификатор на самом деле не нужен. То есть ваша базовая структура данных хранит строки ("Branch1", "Branch2"), а не целые числа (1,2).

Если это не так, используйте настраиваемый фильтр. Недавно у меня была ситуация, когда дни недели сохранялись в бэкенде как целые числа (1-7), но пользователь ожидал увидеть в сетке строку полного имени. Ниже мое решение, модифицированное для этого примера:

angular.module('myApp').filter("branchFilter", function() {
    var vals = ["Branch1", "Branch2"];
    return function(id) {
        var i = id-1, ret = "?";
        if(i>=0 && i< vals.length) {
            ret = vals[i];
        }
        return ret;
    };
});

Затем в столбце Defs добавьте cellFilter: 'branchFilter'.

При этом раздражает то, что ui-grid предполагает, что вам нужно различать id и value в раскрывающемся списке, но затем отображает идентификатор, за исключением случаев редактирования. Трудно представить себе случай, когда такое поведение было бы полезно пользователю.

Я заметил, что у вас есть комбо-значения, хранящиеся в отдельном массиве. Вот подход, который повторно использует эту структуру. Во-первых, поместите комбинированные значения туда, где они могут быть доступны в вашем приложении:

angular.module('myApp').value('ComboValues', {
    branches: [
        {id:1, value:"Branch1"},
        {id:2, value:"Branch2"},
        ...
    ]
});

А затем сообщите пользовательскому фильтру, как использовать значения:

angular.module('myApp').filter("comboFilter", function(ComboValues) {
    return function(id, comboName, idName, valName) {
        idName = idName || "id";      //optional - defaults to 'id'
        valName = valName || "value"; //optional - defaults to 'value'
        var opts = ComboValues[comboName];
        if(angular.isArray(opts)) {
            var ret = id; //default return value if no match found
            opts.some(function(opt) {  //look for matching option
                if(opt[idName]===id) {
                    ret = opt[valName];
                    return true; //break
                }//else keep looking
            });
            return ret;
        } else {
            return comboName+ " not an array";
        }
    };
});

Затем в столбце Defs используйте: cellFilter: "comboFilter:'branch':'id':'value'" или, если значения по умолчанию в порядке: cellFilter: "comboFilter:'branch'"

Обратите внимание, что в этом примере параметры нуждаются в дополнительных кавычках, поэтому фильтр обрабатывает их как строки, а не как переменные области. То есть: "comboFilter:'branch'" не "comboFilter:branch".

person Trevedhek    schedule 11.11.2015

Я решил это, просто добавив следующее свойство: -

editDropdownIdLabel: 'DEPARTMENT',
person Anup    schedule 31.12.2014