Выберите параметр из раскрывающегося списка по его значению — Angularjs

У меня есть фабрика, которая извлекает параметры раскрывающегося списка из базы данных:

app.factory('populateDDL', function($http) {
    'use strict';
    return function (tbl,key) {
        var json,
            data = JSON.stringify({
                sKey: key,
                sTableName: tbl
            });
        return $http.post('util.asmx/populateDDL',data).
        then(function(response) {
            return JSON.parse(response.data.d);
        });
    };
});

Затем я применяю эти данные к раскрывающемуся списку/выбору в моем контроллере:

app.controller('userSettings', function($scope, $http, populateDDL) {
            $scope.clinicLocations = new populateDDL('locations',key).
            then(function(response) {
                console.log(response);
                $scope.clinicsDDL = response.locations;
                $http({
                    url: 'util.asmx/returnUser', 
                    method: 'POST',
                    data: {sUserId: uid},  
                })
                .success(function(user) {
                    $scope.user = user.d;
                })
                .error(function(data, status, headers, config) {
                    console.log(data+', '+status+', '+headers+', '+config);
                });
            });
        });

Вот как выглядит тег select:

<select ng-model="clinicsDDL.item" ng-options="item.name for item in clinicsDDL track by item.id" ngRequired />

Данные выпадающего списка, которые помещаются в $scope.clinicsDDL, выглядят следующим образом:

[{
    "id": "19",
    "name": "other clinic"
}, {
    "id": "39",
    "name": "My clinic"
}]

Возвращаемые пользовательские данные из БД выглядят так:

{
    "__type": "User",
    "FirstName": "Erik",
    "LastName": "Grosskurth",
    "DefaultLocationId": "39"
}

Внутри моего контроллера я заполняю раскрывающийся список/выбираю, а затем беру идентификатор пользователя и отправляю его в БД для информации о пользователе. Эта информация о пользователе возвращается. Затем я хочу выбрать конкретный параметр из ранее заполненного списка на основе того, что такое «DefaultLocationId», который возвращается из БД.

Как мне это сделать?

$scope.clinicsDDL.item = $scope.clinicsDDL[0];

^^^ не работает, потому что я не могу зависеть от того, чтобы массив всегда формировался одинаково. Мне нужно настроить таргетинг на элемент массива на основе «DefaultLocationId», а не целого числа.

В jQuery вы бы выбрали селектор, используя $('#clinicsDDL option[value="19"').doSomething();

Я думал, что в angular это будет примерно так:

$scope.clinicsDDL.item = $scope.clinicsDDL[value="19"];

^^^ но это тоже не работает


person Erik Grosskurth    schedule 06.07.2016    source источник


Ответы (1)


В предварительном отборе используются только ссылки. Если вы хотите выбрать элемент и не знаете, в каком поле он содержится, вам придется искать его. Вместо использования array.filter() вы должны использовать функцию поиска lodash (https://lodash.com/docs#find< /а>)

//preselect DefaultLocationId 39
$scope.clinicsDDL.item = _.find($scope.clinicsDDL, {DefaultLocationId : 39});

_.find(...) вернет неопределенное значение, если элемент не найден. Таким образом, вы можете оставить его неопределенным или использовать значение по умолчанию, например

$scope.clinicsDDL.item = _.find($scope.clinicsDDL, {DefaultLocationId : 39}) || $scope.clinicsDDL[0];
person Sascha Engmann    schedule 06.07.2016
comment
angular.js: 13424 ReferenceError: _ не определен - person Erik Grosskurth; 06.07.2016
comment
Это не решение Angular. Я также могу выполнить исправление одной строки в других плагинах. Я ищу чистое решение Angular, спасибо. - person Erik Grosskurth; 07.07.2016
comment
Затем вы можете использовать array.filter(). Этот подход - чистый javascript. С тем недостатком, что вызов функции перебирает все элементы массива и возвращает новый массив. Если вы не хотите использовать чистый Javascript и принудительно использовать решение AngularJS, вы можете использовать фильтр filter. Внедрите службу $filter в свой контроллер и вызовите $filter("filter")($scope.clinicsDDL, {DefaultLocationId : 39}) Здесь тот же недостаток, вы выполняете итерацию по всем элементам в массиве. Не забывайте, что tis возвращает массив. Когда идентификатор уникален, вы должны получить доступ к возвращаемому значению с индексом 0. - person Sascha Engmann; 08.07.2016