Как создать пользовательскую директиву angular, содержащую несколько элементов управления вводом?

Я работаю над своим первым угловым проектом. Хорошо это или плохо, но я пытаюсь преобразовать почти весь повторяющийся HTML в директивы. У меня есть требование, чтобы пользователь мог выбрать время в формате ЧЧ:ММ. Поэтому мне нужно показать два элемента SELECT. Поскольку мне нужно дать этот контроль во многих местах, я пытаюсь преобразовать его в директиву.

Шаблон директивы

<div class="filterLabel">{{fieldLabel}}</div>
<select class="FilterDDL" ng-style="{width: selectHhWidthPx + 'px'}">
    <option value="none">HH</option>    
    <option value="8">08</option>       
    <option value="9">09</option>       
    <option value="10">10</option>      
    <option value="11">11</option>      
    <option value="12">12</option>      
    <option value="13">13</option>      
    <option value="14">14</option>      
    <option value="15">15</option>      
    <option value="16">16</option>      
    <option value="17">17</option>      
</select>
<span>:</span>
<select class="FilterDDL" ng-style="{width: selectHhWidthPx + 'px'}">
    <option value="none">MM</option>    
    <option value="0">00</option>       
    <option value="30">30</option>      
</select>

Мой ожидаемый конечный результат от этой директивы — получить значение времени в минутах [(ЧЧ * 60 + ММ)] для дальнейших вычислений. Однако я не могу придумать способ, которым я могу получить одну ngModel, связанную с моей директивой, которая возвращает время в минутах из комбинации двух раскрывающихся списков. Я читал о функции Link, но не могу понять, могу ли я использовать ее в своем сценарии. Является ли хорошей практикой иметь пользовательские директивы, охватывающие несколько элементов ввода?


person Surya    schedule 28.01.2016    source источник


Ответы (1)


Пожалуйста, обратитесь к коду ниже:

<!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title></title>
    <script src="angular.min.js"></script>

    <script type="text/javascript">
        angular.module('demoApp', [])
            .controller('Controller', ['$scope', function ($scope) {
                $scope.totalMinutes = function () {
                    return $scope.mintutes + ($scope.hours * 60);
                }
                $scope.mintutes = 1;
                $scope.hours = 1;
            }])
            .directive('timeSelection', function () {
                return {
                    restrict: 'E',
                    template: "Hours:<input type='number' ng-model='hours' /> Minutes:<input type='number' ng-model='minutes' />",
                    scope: {
                        hours: "=hours",
                        minutes:"=mintutes"
                    }
                };
            });
    </script>
</head>
<body>
    <div ng-app="demoApp">
        <div ng-controller="Controller">
            <time-selection hours="hours" mintutes="mintutes" ></time-selection>
            Total Minutes : {{totalMinutes()}}
        </div>
    </div>
</body>
</html>
person rishikesh tadaka    schedule 28.01.2016
comment
Я думал об этом, но тогда как это получится, когда в одном ngApp есть несколько директив такого типа. Не будут ли модели конфликтовать друг с другом, если мы вычислим их все в глобальном контроллере (контроллер вне директивы)? - person Surya; 28.01.2016
comment
По сути, я использовал ваш подход, чтобы получить то, что хотел. Хотя сделал небольшое изменение. Вместо того, чтобы передавать простую ngModel в элементы управления вводом, я передал два свойства объекта, такие как StartTime.Hours и StartTime.Minutes. Так что теперь я могу использовать разные объекты с моими контроллерами ввода, и модели не конфликтуют. Спасибо за помощь. - person Surya; 30.01.2016