Angular: как проверить, является ли элемент выбора множественным, и установить выбранный параметр?

Служба Angular, ответственная за создание URL-адресов из значений элементов select и multi-select, сводит меня с ума.

multi-select использует массив для хранения выбранных значений, даже если есть только один элемент.

{
    "select006": [
        "m30x1.5",
        "m18x1"
    ]
}

{
    "select006": [
        "m30x1.5"
    ]
}

single select использует просто строку для хранения выбранного значения.

{
    "select006": "m30x1.5"
}

Как мне справиться с этой проблемой? Как проверить, является ли элемент выбора множественным или нет, и установить для выбранной опции определенное значение (значения)?

Вот соответствующий код:

/**
 * Expand multiple values
 *
 * Convert param values back to an object with array
 * of values.
 * 
 * @example ?param=m30x1.5,m18x1 becomes {"select006": ["m30x1.5","m18x1"]}
 * 
 * @param filters
 * @returns {object}
 * @private
 */
var _expandMultipleValues = function (filters) {

    var param = {};

    for (var filter in filters) {
        if (filters.hasOwnProperty(filter)) {
            if (filters[filter].indexOf(',') > -1) {
                param[filter] = filters[filter].split(',');
            } else {
                 // multiple needs to be an array to set selected option
                 // param[filter] = [filters[filter]];

                 // singe needs to be an string to set selected option
                 // param[filter] = filters[filter];
            }
        }
    }

    return param;
};

Кажется, мне нужно быть более конкретным. Проблема здесь в том, что мне нужен массив для установки выбранного параметра для множественного выбора (даже если выбран только один), но строка для одного выбора.

У меня есть переменная в $scope, которая содержит выбранные элементы:

$scope.filter = {
    "SA152": ["lorem", "ipsum"],
    "SA044": ["30mm"],
    "SA034": "m8x3"
}

Если я попытаюсь установить выбранный параметр для SA044 с помощью "SA044": '30mm', множественный выбор не будет выбран, так как в angular множественный выбор должен быть массивом.

Это устанавливает выбранный параметр для множественного выбора:

$scope.filter = {
    "SA044": ['30mm']
}

Это не работает для множественного выбора:

$scope.filter = {
    "SA044": "30mm"
}

Наоборот, для отдельных элементов select.


person gearsdigital    schedule 02.05.2014    source источник
comment
не могли бы вы добавить свой html?   -  person Jossef Harush    schedule 02.05.2014


Ответы (2)


Что ж, вы можете проверить, является ли переменная массивом или строкой, используя instanceOf, typeOf или .constuctor: см. здесь http://tobyho.com/2011/01/28/checking-types-in-javascript/

 if(myVariable instanceOf Array){
     //multi select
 } else if(myVariable.constructor === String){
     //single select
 }

или вы можете просто преобразовать свою строку в массив и проверить длину массива.

 $scope.myVariable = $scope.myPreviousVar.split(','); // or however you want to delimit this
 if($scope.myVariable.length === 1){
     //single select
 } else if($scope.myVariable.length > 1){
     //multi select
 }
person SoluableNonagon    schedule 02.05.2014
comment
Спасибо за ваш комментарий. Я должен быть более конкретным. Проблема здесь в том, что мне нужен массив для установки выбранного параметра для множественного выбора (даже если выбран только один), но строка для одного выбора. Проверка типов - не моя проблема, имхо... - person gearsdigital; 02.05.2014
comment
Пожалуйста, смотрите мое обновление. Надеюсь, я ясно дал понять, что я пытаюсь исправить - person gearsdigital; 02.05.2014

Предполагая, что ваш ввод может быть:

$scope.data = {
    "select006": "m30x1.5"
}

or

$scope.data = {
    "select006": [
        "m30x1.5"
    ]
}

Проверьте, равно ли значение select006 Array. если да, то это множественный выбор, в противном случае - одиночный выбор.

if ($scope.data.select006 instanceof Array) 
{
    // this is a multi-select, 
    // $scope.data.select006 is an array of selections
} 
else 
{
    // this is a single-select, 
    // $scope.data.select006 is the single selection value
}
person Jossef Harush    schedule 02.05.2014
comment
Благодарю вас! Проверка типов не решает мою проблему здесь. Пожалуйста, смотрите мое обновление. Надеюсь, я ясно дал понять, что я пытаюсь исправить. - person gearsdigital; 02.05.2014