【问题标题】:How to create a custom angular directive which contains multiple input controls?如何创建包含多个输入控件的自定义角度指令?
【发布时间】:2016-01-28 11:54:09
【问题描述】:

我正在做我的第一个 Angular 项目。无论好坏,我都在尝试将几乎所有可重复的 HTML 转换为指令。我需要让用户选择 HH:MM 格式的时间。所以我需要显示两个 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>

该指令的预期最终结果是获得以分钟为单位的时间值 [(HH * 60 + MM)] 以供进一步计算。但是,我想不出一种方法可以获取与我的指令关联的单个 ngModel,该指令从两个下拉列表的组合中返回以分钟为单位的时间。我阅读了有关链接功能的信息,但不知道是否可以在我的场景中使用它。让自定义指令跨越多个输入元素甚至是一种好习惯吗?

【问题讨论】:

    标签: javascript angularjs angular2-directives


    【解决方案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>
    

    【讨论】:

    • 我想到了这一点,但是当单个 ngApp 中有多个此类指令时,这将如何实现。如果我们在全局控制器(指令外的控制器)中计算它们,模型会不会相互冲突?
    • 我基本上是用你的方法来得到我想要的。不过做了一点小改动。我没有将简单的 ngModel 传递给输入控件,而是传递了两个对象属性,例如 StartTime.Hours 和 StartTime.Minutes。所以我现在可以在我的输入控制器中使用不同的对象,并且模型不会冲突。感谢您的帮助。
    猜你喜欢
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    • 2016-05-04
    • 2020-03-21
    相关资源
    最近更新 更多