Привязка ng-модели к параметру Service из шаблона

Я храню модель данных в сервисе, чтобы их могли использовать различные контроллеры. Внутри контроллера я ограничиваю его так, чтобы элементы могли связываться с ним, используя ng-модель:

В контроллере:

angular.module('hiveApp').controller('weatherController', function($scope, $rootScope, weatherModel, messageService, utilityService, $http, $timeout, $cookies, $window, $controller) {

$scope.weatherModel = weatherModel;

Затем в элементе HTML:

<input type="text" id="city" ng-model="weatherModel.city" />

Пока все хорошо, это работает. Проблема возникает, когда я ввожу директиву в микс. У меня есть директива, которая обрабатывает пару переключателей и использует шаблон. Этот шаблон пытается использовать ng-модель для ссылки на те же параметры сервиса weatherModel, однако, хотя он работает из HTML-кода на самой странице, шаблон директивы не работает:

app.directive('radiopair', function() {
return {
    restrict: 'E',
    template: `
        <div style="color:white; float:left">
            <input type="radio" id="metric" name="conversion" value="metric"
                   ng-model="weatherModel.conversion" selected> Metric<br>
            <input type="radio" id="imperial" name="conversion" value="imperial"
                   ng-model="weatherModel.conversion"> Imperial<br>
        </div>
    `,
    link: function ($scope, element, attrs) {
        element.on('click', function (event) {
            event.currentTarget.selected = true;
            $scope.refreshTable();  
        });
    }       
}
});

Когда я переключаюсь между двумя кнопками, значение ng-model=weatherModel.conversion никогда не обновляется. Я полагаю, что это должно быть какой-то проблемой, но я бью стену о том, как это исправить.

1 ответ

Вместо использования обработчика щелчка для вызова refreshTable используйте директиву ng-change:

app.directive('radiopair', function() {
    return {
        restrict: 'E',
        template: `
            <div style="color:white; float:left">
                <input type="radio" id="metric" name="conversion" value="metric"
                       ng-change="refreshTable()"
                       ng-model="weatherModel.conversion" selected> Metric<br>
                <input type="radio" id="imperial" name="conversion" value="imperial"
                       ng-change="refreshTable()"
                       ng-model="weatherModel.conversion"> Imperial<br>
            </div>
        `,
        //link: function ($scope, element, attrs) {
        //    element.on('click', function (event) {
        //        event.currentTarget.selected = true;
        //        $scope.refreshTable();  
        //    });
        //}       
    }
});

Избегайте манипулирования select атрибут <input> элементы. Это должно быть сделано ng-model директива и ngModelController,

Другие вопросы по тегам