запускать угловую функцию, когда опция выбрана из раскрывающегося списка

Я заполняю раскрывающееся меню выбора, вызывая API. Когда пользователь выбирает параметр в меню выбора, я хочу запустить вторую функцию - $scope.getRoles(). Тем не менее, это стреляет немедленно. Есть идеи, почему это происходит? Пожалуйста, смотрите мой код ниже.

html

<select>
     <option ng-change="getRoles()" ng-repeat="country in countries">{{ country.countryCode }}</option>   
</select>

угловой

app.controller("jobsCtrl", function($scope, careerData) {

    //get list of countries when app loads
    careerData.countryList().then(function successCallback(response) {
            $scope.countries = response.data;   
            $scope.countries.unshift({countryCode: "Select a country"}); 
        }, function errorCallback(response) {  
            console.log(response);
    });

    $scope.getRoles = careerData.jobByCountry().then(function successCallback(response) {
            console.log(response)
        }, function errorCallback(response) {  
            console.log(response);
    })
});

app.factory('careerData', ['$http', function($http){
return {

     countryList: function() {
        return $http({
            method: 'GET',
            url: 'testUrl'
        })
    },

    jobByCountry: function() {
        return $http({
            method: 'GET',
            url: 'someurl'
        })
    }
}
}]);

person Community    schedule 11.07.2016    source источник
comment
Во-первых, добавьте ng-model к элементу select, затем поместите директиву ng-change над элементом select вместо размещения ее на option.   -  person Pankaj Parkar    schedule 11.07.2016
comment
Вы не можете использовать события на <option>. Не поддерживается кросс-браузер ... особенно IE и, я думаю, Safari   -  person charlietfl    schedule 11.07.2016


Ответы (2)


Сначала вы должны использовать ngOptions.

Измените это:

<select>
  <option ng-change="getRoles()" ng-repeat="country in countries">{{ country.countryCode }}</option>   
</select>

для:

<select ng-options="country as country.countryCode for country in countries" ng-model="countrySelected" ng-change="getRoles()">  
</select>

Пример:

angular.module('app', [])
  .controller('mainCtrl', function($scope) {
    $scope.cars = ["Audi", "BMW", "Corolla", "Mercedes"];

    $scope.check = function() {
      console.log($scope.car);
    }
  });
<!DOCTYPE html>
<html ng-app="app">

<head>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.7/angular.min.js"></script>
</head>

<body ng-controller="mainCtrl">
    Cars:
    <select ng-model="car" ng-options="car for car in cars" ng-change="check()">
       <option value="">Select a car</option>
    </select>
</body>

</html>

person developer033    schedule 11.07.2016
comment
из того, что я могу сказать, это все еще стреляет до изменения! - person ; 12.07.2016
comment
Это невозможно. - person developer033; 12.07.2016
comment
@phantom, проверь выше, нет пути к функции, вызываемой перед выбором. - person developer033; 12.07.2016

так что я думаю, что вы искали это

(ngModelChange)="getRoles()"

в вашем HTML-теге.

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

это для angular 7. это тоже старый вопрос.

комментарий:

но я надеюсь, что это поможет вам, потому что на это все еще нет ответа, если предыдущий ответ работает, примите его.

person Marc Roelse    schedule 04.04.2019