将自定义指令添加到已具有角度指令[ng-model / ng-required]的现有输入中

大卫·克鲁威斯

我想用装饰有一个标准的输入控制ng-modelng-required,然后添加自己的自定义属性的指令,它提供uib-typeahead的功能来控制。

我使用此链接使我的指令部分起作用。

从AngularJS中的指令添加指令

PLUNKR-指令的第2版不适用于ng-model

我的指令确实添加了预输入功能,并且效果很好,但是在选择项目之后,它并没有将模型绑定到控件上。

我有两个版本的指令。

版本1:是元素样式指令,并且我已经成功使用了一段时间,但是当我不想对输入元素进行更多控制时,尤其是当我想使用ng-required ='时,它就达不到要求了。 true”和其他ng-message指令。

版本2:是一个属性样式指令,我这样做了,因为我觉得最好将我想要的typeahead功能添加到可以选择使用的任何标准HTML中ng-required='true'ng-model等等。

虽然该指令大部分有效,但它无法正确交互,因此ng-model我不确定如何使它正常工作

angular.module(APP)

.directive('wkLocationSuggest', ['$compile', function ($compile) {
  return {
    restrict: 'A',
    require: 'ngModel',
    replace: false,
    //terminal: true,
    //priority: 0,
    scope: {
      wkApiModel: '=' // Provide access to the internal data that is returned via the API lookup
    },
    controller: 'LocationSuggestController',
    link: function (scope, element, attrs, ngModelCtrl) {
      if (!ngModelCtrl) {
        return;
      }

      element.attr('typeahead', 'location as row.location for row in typeAhead($viewValue)');
      element.attr('typeahead-wait-ms', '750');
      element.attr('typeahead-on-select', 'onSelectInternal($item, $model, $label)');
      element.attr('typeahead-min-length', '2');
      element.attr('typeahead-focus-first', 'true');

      element.removeAttr("wk-location-suggest");        //remove the location-suggest to avoid indefinite loop
      element.removeAttr("data-wk-location-suggest");   //also remove the same attribute with data- prefix if it exists

      // None of this is working
      //// invoked when model changes from the outside
      //ngModelCtrl.$render = function () {
      //  //scope.innerModel = ngModelCtrl.$modelValue;
      //};

      ////// invoked when model changes from the inside
      //scope.onChange = function (value) {
      //  ngModelCtrl.$setViewValue(scope.innerModel);
      //};

      scope.onSelectInternal = function ($item, $model, $label) {

        // This fires, but it effects the ng-model on the first input, 
        // but not the input that this directive is attached too
        ngModelCtrl.$setViewValue($item.location);

      };

      $compile(element)(scope);

    }
  };
}]);

这两个图像演示了部分问题,使用上面的PLUNKR可能会更好地进行自我测试

该指令的版本1和2

版本2不能正常工作

艾哈迈德·巴克塔什·哈耶里(Ahmad Baktash Hayeri)

最初,我尝试通过结合使用方法在input元素上实现从而将验证器动态添加到您的wk-location-suggest-new指令中但不知道到底是什么原因阻止了该事件的触发。blurngModel$setValidity

因此,我转向另一个指令,wk-location-suggest-old并对其进行了一些微调以适合两种期望的行为。

在那里,我注意到您遗漏了几件事:

  • 首先,为了使form元素与表单本身(在您的情况下)粘合在一起wkProfileCompany并使用ng-model,该元素(在指令模板中)需要一个name
  • 其次,ng-required(或required)仅当表单作为属性添加到指令模板中的元素时才适用于该表单,而不是编译为包含该元素的模板的指令。

指令定义

您可能会注意到,我已经将两个属性从外部范围传递到指令的内部范围,即:

  • name输入元件的,
  • 一个isRequired标志,用于指定是否需要输入

.directive('wkLocationSuggestOld', [function () {
  return {
    restrict: 'E',
    require: '?ngModel',
    scope: {
      name: '@',      // <==
      isRequired: '=' // <==
    },
    template: '<input name="{{name}}" type="text" class="{{innerClass}}" ng-model="innerModel"'
       + ' ng-change="onChange()" uib-typeahead="location as row.location for row in typeAhead($viewValue)" '
       + ' typeahead-wait-ms="750" typeahead-on-select="onSelectInternal($item, $model, $label)" '
       + ' typeahead-min-length="2" typeahead-focus-first="true" '
       + ' ng-required="isRequired">',  // <== added ng-required here
    controller: 'LocationSuggestController',
    link: function (scope, element, attrs, ngModel) {
      if (!ngModel) {
          return;
      }          
      ...
}])

的HTML

最后,您可以在HTML中使用经过调整的指令,如下所示:

<wk-location-suggest-old class="form-control" type="text" name="location2" ng-model="location2" is-required="true"></wk-location-suggest-old>

柱塞


更新

ng-model无法将wk-location-suggest-new指令正确绑定到提供的值(location3的可能原因之一是,您DOM要用新的自定义DOM元素替换整个元素,而该自定义元素是使用指令本身隔离进行编译 scope

由于该指令wk-location-suggest-new具有隔离范围,因此该范围完全不知道location3,因为location3和所有其他位置值)是在MainCtrl指令本身的范围内定义的,而不是在指令本身的范围内定义的因此,您最终将把输入的值绑定到undefined属性。

link: function (scope, element, attrs, ngModelCtrl) {
   if (!ngModelCtrl) {
     return;
   }
 ...
$compile(element)(scope); // <== here

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

角度无法在自定义指令中$ watch ng-model

来自分类Dev

简单的自定义指令将ng-attribute添加到输入元素

来自分类Dev

有角度的。内含ng-repeat的自定义指令

来自分类Dev

具有隔离范围的角度自定义指令不会触发ng-click函数

来自分类Dev

Angular JS - 将 ng-model 添加到在表单中调用的指令

来自分类Dev

具有隔离范围指令的ng-model

来自分类Dev

如何在自定义指令中设置ng-model-options?

来自分类Dev

如何在自定义Angular指令中更改ng-model范围值?

来自分类Dev

编写自定义指令以将工具提示添加到AngularJS(TypeScript)中的ng-options

来自分类Dev

ng-repeat中具有动态字段名称的自定义指令

来自分类Dev

AngularJS:ng-repeat在具有隔离范围的自定义指令上

来自分类Dev

在Angular自定义指令的日期选择器中的ng-Model中格式化日期

来自分类Dev

在指令中定义 ng-model 后,Angularjs ng-model 不起作用

来自分类Dev

在嵌套指令中传递ng-model

来自分类Dev

ng-model没有暴露在指令之外

来自分类Dev

在AngularJS中,如何创建一个自定义验证指令,该指令采用$ scope变量并将其与ng-model比较是否相等?

来自分类Dev

结合Angular指令,特别是带有ng-mousemove的自定义指令

来自分类Dev

ng-repeat中具有隔离范围的自定义指令:循环项突然为空

来自分类Dev

带有ng-model-options的指令无法向模型数组添加新元素

来自分类Dev

有什么方法可以使用指令动态添加ng-model-options吗?

来自分类Dev

带有ng-model-options的指令无法向模型数组添加新元素

来自分类Dev

自定义角度指令中的ng-switch打破了两种方式的绑定

来自分类Dev

angular $ scope.variable没有在输入上使用ng-model指令更新

来自分类Dev

ng-messages不会显示在自定义指令中

来自分类Dev

具有ng-model的名称数组

来自分类Dev

包含输入中的ng-model中断

来自分类Dev

ng-transclude中的ng-model

来自分类Dev

AngularJS自定义指令:如何更新ng-model中指定的父变量?

来自分类Dev

触发自定义验证指令后,AngularJS ng-model值丢失

Related 相关文章

  1. 1

    角度无法在自定义指令中$ watch ng-model

  2. 2

    简单的自定义指令将ng-attribute添加到输入元素

  3. 3

    有角度的。内含ng-repeat的自定义指令

  4. 4

    具有隔离范围的角度自定义指令不会触发ng-click函数

  5. 5

    Angular JS - 将 ng-model 添加到在表单中调用的指令

  6. 6

    具有隔离范围指令的ng-model

  7. 7

    如何在自定义指令中设置ng-model-options?

  8. 8

    如何在自定义Angular指令中更改ng-model范围值?

  9. 9

    编写自定义指令以将工具提示添加到AngularJS(TypeScript)中的ng-options

  10. 10

    ng-repeat中具有动态字段名称的自定义指令

  11. 11

    AngularJS:ng-repeat在具有隔离范围的自定义指令上

  12. 12

    在Angular自定义指令的日期选择器中的ng-Model中格式化日期

  13. 13

    在指令中定义 ng-model 后,Angularjs ng-model 不起作用

  14. 14

    在嵌套指令中传递ng-model

  15. 15

    ng-model没有暴露在指令之外

  16. 16

    在AngularJS中,如何创建一个自定义验证指令,该指令采用$ scope变量并将其与ng-model比较是否相等?

  17. 17

    结合Angular指令,特别是带有ng-mousemove的自定义指令

  18. 18

    ng-repeat中具有隔离范围的自定义指令:循环项突然为空

  19. 19

    带有ng-model-options的指令无法向模型数组添加新元素

  20. 20

    有什么方法可以使用指令动态添加ng-model-options吗?

  21. 21

    带有ng-model-options的指令无法向模型数组添加新元素

  22. 22

    自定义角度指令中的ng-switch打破了两种方式的绑定

  23. 23

    angular $ scope.variable没有在输入上使用ng-model指令更新

  24. 24

    ng-messages不会显示在自定义指令中

  25. 25

    具有ng-model的名称数组

  26. 26

    包含输入中的ng-model中断

  27. 27

    ng-transclude中的ng-model

  28. 28

    AngularJS自定义指令:如何更新ng-model中指定的父变量?

  29. 29

    触发自定义验证指令后,AngularJS ng-model值丢失

热门标签

归档