У меня есть редактируемый Uigrid с директивой ui-grid-cellnav, позволяющей редактировать фокус. У меня также есть фильтр для отображения значения вместо идентификатора в раскрывающемся списке.
<div ui-grid="gridOptions" ui-grid-edit ui-grid-cellnav class="grid"></div>
JS
$scope.gridOptions.columnDefs = [
{ name:'name', width:100 },
{ name:'age', width:100},
{ name: 'gender', displayName: 'Gender', editableCellTemplate: 'ui-grid/dropdownEditor', width: '20%',
cellFilter: "griddropdown:this", editDropdownIdLabel:'id',
editDropdownValueLabel: 'gender', editDropdownOptionsArray: [
{ id: 1, gender: 'male' },
{ id: 2, gender: 'female' }
] }
];
Ошибка возникает всякий раз, когда значение раскрывающегося списка изменяется. Кажется, что параметр фильтра передается как строка вместо фактического объекта, но не знаю, почему. Работает нормально, если я удалю директиву cellnav.
Plnkr
Заранее спасибо!
Ответ 1 · рейтинг 1 · jnthnjns
Интересно, я немного поиграл с этим, и похоже, что вы получаете желаемые результаты, просто иногда ui-grid любит передавать строку в качестве параметра вместо объекта.
Если вы добавите проверку строки в свой фильтр, похоже, вы все равно получите желаемые результаты, если я правильно понимаю:
Проверка строки для добавления:
if (typeof context !== 'string') {}
Полный фильтр:
.filter('griddropdown', function() {
return function (input, context) {
if (typeof context !== 'string') {
var map = context.col.colDef.editDropdownOptionsArray;
var idField = context.col.colDef.editDropdownIdLabel;
var valueField = context.col.colDef.editDropdownValueLabel;
var initial = context.row.entity[context.col.field];
if (typeof map !== "undefined") {
for (var i = 0; i < map.length; i++) {
if (map[i][idField] == input) {
return map[i][valueField];
}
}
} else if (initial) {
return initial;
}
}
return input;
};
});