приравнивание переменных, которые исходят от http-вызовов

У меня есть тег select с параметрами, заполненными AngularJS. Я пытаюсь выбрать вариант, если он равен другому свойству в области видимости. Значения параметров и свойства области, которые я пытаюсь сравнить, исходят из асинхронного http-вызова. Так что всегда есть задержка, значит, она не работает должным образом. Как лучше всего убедиться, что оба свойства области разрешены и готовы к сравнению.

ng-selected="MusteriId == option.Value" сравнивает часть.

<select id="MusteriId" name="MusteriId" ng-model="MusteriId">
    <option ng-selected="MusteriId == option.Value"
            ng-repeat="option in MusteriList" value="{{option.Value}}">
      {{option.Text}}
    </option>
</select>

Это мой контроллер, на котором выполняются два http-вызова.

(function() {
var biletController = function ($scope, $http, commonFunctions) {

    $scope.Id = null;
    $scope.BiletNo = null;
    $scope.BiletTarihi = null;
    $scope.CurrencyId = null;
    $scope.MusteriId = null;
    $scope.PAID_EUR = null;
    $scope.PAID_TL = null;
    $scope.PAID_USD = null;
    $scope.ServisIstiyorMu = null;
    $scope.TOTAL = null;
    $scope.TourId = null;

    $scope.MusteriList = null;

    $scope.openEditFormJS = function(e) {
        $http.get('/Bilet/Get/' + e)
            .then(function (response) {

                console.log(response.data);

                $scope.Id = response.data.Id;
                $scope.BiletNo = response.data.BiletNo;

                if (response.data.BiletTarihi) {
                    $scope.BiletTarihi = commonFunctions.formatDate(new Date(parseInt(response.data.BiletTarihi.substr(6))));
                }

                $scope.CurrencyId = response.data.CurrencyId;
                $scope.MusteriId = response.data.MusteriId;
                $scope.PAID_EUR = response.data.PAID_EUR;
                $scope.PAID_TL = response.data.PAID_TL;
                $scope.PAID_USD = response.data.PAID_USD;
                $scope.ServisIstiyorMu = response.data.ServisIstiyorMu;
                $scope.TOTAL = response.data.TOTAL;
                $scope.TourId = response.data.TourId;

                $('#modal').modal('show');

            });

        $http.get('/Bilet/GetMusteriSelectList')
            .then(function (response) {

                console.log(response.data);
                $scope.MusteriList = response.data;
            });
    };

};

app.controller('BiletController', ['$scope', '$http', 'commonFunctions', biletController]);
}());

person Savas Karaduman    schedule 05.05.2019    source источник
comment
Чтобы лучше понять проблему, мне нужно увидеть пример response.data из обоих запросов $http.   -  person georgeawg    schedule 05.05.2019


Ответы (1)


Используйте директиву ng-value для нестроковых значений1

<select id="MusteriId" name="MusteriId" ng-model="MusteriId">
    <option ̶n̶g̶-̶s̶e̶l̶e̶c̶t̶e̶d̶=̶"̶M̶u̶s̶t̶e̶r̶i̶I̶d̶ ̶=̶=̶ ̶o̶p̶t̶i̶o̶n̶.̶V̶a̶l̶u̶e̶"̶
            ng-repeat="option in MusteriList" ng-value="option.Value">
      {{option.Text}}
    </option>
</select>

Для получения дополнительной информации см. Использование ngValue для привязать модель к массиву объектов


Не используйте ngSelected с ngModel2

<select id="MusteriId" name="MusteriId" ng-model="MusteriId">
    <option ̶n̶g̶-̶s̶e̶l̶e̶c̶t̶e̶d̶=̶"̶M̶u̶s̶t̶e̶r̶i̶I̶d̶ ̶=̶=̶ ̶o̶p̶t̶i̶o̶n̶.̶V̶a̶l̶u̶e̶"̶
            ng-repeat="option in MusteriList" value="{{option.Value}}">
      {{option.Text}}
    </option>
</select>

Из документов:

Примечание: ngSelected не взаимодействует с директивами <select> и ngModel, он только устанавливает атрибут selected для элемента. Если вы используете ngModel для выбора, вы не должны использовать ngSelected для параметров, так как ngModel установит значение выбора и выбранные параметры.

справочник по API AngularJS ng-selected

См. дополнительные документы:

См. Переполнение стека:


person georgeawg    schedule 05.05.2019
comment
Спасибо, ваше решение работает, только если я конвертирую результат MusteriId из ответа http в String. Есть ли у вас какие-либо предложения, могу ли я реализовать что-то, что http приводит к автоматическому преобразованию в строку. Это то, что я использовал › $scope.MusteriId = String(response.data.MusteriId); - person Savas Karaduman; 05.05.2019
comment
Вы использовали value="{{option.Value}}" или ng-value="option.Value"? - person georgeawg; 05.05.2019
comment
Я использовал ng-value=option.Value, как вы советовали. Он работает нормально, но чувствителен к типу данных, строке или числу. Я должен использовать преобразование в String, чтобы заставить его работать, и это имеет смысл. - person Savas Karaduman; 05.05.2019
comment
Директива <select> использует строгое равенство (===) при сравнении ng-model со свойством value. Это означает, что true,"true",0,false,"0",77 и "77" могут иметь отдельные параметры выбора. Если один запрос к серверу возвращает числовые идентификаторы, а другой запрос возвращает строковые идентификаторы, это было неудачным проектным решением кодировщиков бэкэнда. - person georgeawg; 05.05.2019