在angular中创建自定义输入指令
在angular中创建自定义输入指令
我想创建一个自定义输入框,看起来像这样:
my-input应该接收任何常规输入框可以接收的属性(如placeholder等)。
输出应该像这样(myInputTemplate.html):
{{title}}
我创建了一个指令:
myApp.directive('myInput', function(){ return { restrict: 'E', require: 'ngModel', templateUrl: '/myInput/myInputTemplate.html', replace: true, scope: { text: '=ngModel', title: '=title' }, }
});
ng-model现在已经绑定好了,
我的问题是:
我如何将属性(如placeholder等)从my-input传递到内部的输入框中?
我觉得我方法可能有问题,也许我需要这样做:
并将输入框包装在:
{{title}} <这里将是原始输入框>
问题的原因是Plunker无法识别insertBefore和appendTo方法。
解决方法是在代码中使用angular.element方法来创建元素,并使用insertAfter和append方法来插入元素。
第二种方法成功了!最终代码如下:
指令代码如下:
app.directive('myInput', function () {
return {
restrict: 'A',
scope: {
title: '=title'
},
link: function ($scope, $element) {
var wrap = angular.element('');
$element.addClass('form-control').removeAttr('my-input');
wrap.insertAfter($element);
$element.appendTo(wrap);
if ($scope.title) {
var title = angular.element('' + $scope.title + '');
title.appendTo(wrap);
}
},
}
});
我甚至为此创建了我的第一个Plunker,不幸的是,Plunker无法识别insertBefore和appendTo方法。
解决方法是在代码中使用angular.element方法来创建元素,并使用insertAfter和append方法来插入元素。
你可以点击以下链接查看Plunker示例:http://plnkr.co/edit/XnFM75vOBg4ifHUQzGOt?p=preview
问题的原因是,用户想要在Angular中创建一个自定义的输入指令,该指令可以接收任意属性并将其应用到input元素上。
解决方法是使用ng-attr指令来实现。用户可以在HTML中使用ng-attr-placeholder来动态设置输入框的placeholder属性。同时,在指令的作用域中使用placeholder属性来接收传入的属性。
具体的解决方法如下所示:
scope: { text: '=ngModel', title: '=title', placeholder : '=placeholder' }
用户可以通过给指令传递属性来动态设置输入框的任意属性。这样就实现了一个可以接收任意属性的自定义输入指令。
用户可以阅读关于ng-attr-attrName的文档以及一个有用的解答来深入了解动态属性的使用方法。
用户还可以查看相关问题和答案,了解如何将属性数组传递给指令,以及如何使用不同的方式来提问相同的问题。
通过以上解决方法,用户可以在Angular中创建一个通用的自定义输入指令,可以接收任意属性并将其应用到input元素上。
问题的出现原因是在使用自定义指令时,如果没有正确传递参数,将无法获取到预期的结果。解决方法是在指令中使用scope
属性来绑定参数。
在指令调用中,需要使用ng-model
、placeholder
和title
这些参数,并且需要用引号('
)将参数值包裹起来,以示这些值是字符串。这样做可以避免Angular去查找scope
变量。
指令中需要设置scope
属性,来绑定参数值。例如:text: '=ngModel'
表示将ng-model
的值绑定到text
变量上。
模板中可以使用双括号语法{{}}
来显示参数的值。例如:{{title}}
将显示title
参数的值。
如果想要让指令更加通用,可以在指令中添加其他属性。只需要在scope
中添加对应的属性即可。
关于问题中提到的第二种方法,区别在于是否创建一个新的输入框。第一种方法是在指令中创建新的输入框,而第二种方法是将原始输入框包裹在指令的外部。
以上就是解决这个问题的方法,你可以在这里查看演示。