我想使用用ng-model
和ng-required
修饰的标准输入控件,然后添加我自己的自定义属性指令,为控件提供uib-typeahead
功能。
我用这个链接让我的指令部分工作。
Add directives from directive in AngularJS
PLUNKR - The Version 2 of the directive does not work correctly with ng-model
我的指令确实添加了预先输入功能,但效果很好,但是在选择项目后,它并没有将模型绑定到控件上。
我有两个版本的指令。
版本1 :是一个元素样式指令,我已经成功使用了一段时间,但是当我不想对输入元素进行更多控制时,它就失败了,尤其是当我想使用ng-required ='true'和其他ng-message指令时。
版本2 :是一个属性样式指令,我接受了这个,因为我觉得最好只添加我想要的任何标准HTML的typeahead功能,可以选择使用{{1} },ng-required='true'
等...
虽然此指令主要起作用,但它与ng-model
无法正确交互,我不确定如何使其正常工作
ng-model
这两张图片展示了部分问题,可能更适合使用上面的PLUNKR进行测试
答案 0 :(得分:2)
我最初尝试动态添加验证程序到您的wk-location-suggest-new
指令,方法是在输入元素上结合blur
' {ngModel
{ {1}}方法;但是我不知道究竟是什么阻止了事件发生。
因此,我转向另一个指令$setValidity
并稍微调整一下以适应所需的行为。
在那里,我注意到你错过了几件事:
- 首先,为了使表单元素 glue 与表单本身(在您的情况下为
wk-location-suggest-old
),并使用{{ 1}},元素(指令模板中的 )需要名称。- 其次,
wkProfileCompany
(或ng-model
)只有在作为属性添加到指令模板中的元素时才能使用表单,不指令编译到包含元素的模板。
您可能已经注意到,我已经将外部范围内的两个属性传递给指令的内部范围,即:
ng-required
required
标志,用于指定输入是否为必需。
name
最后,您可以在HTML中使用tweaked指令:
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;
}
...
}])
未在<wk-location-suggest-old class="form-control" type="text" name="location2" ng-model="location2" is-required="true"></wk-location-suggest-old>
指令中正确绑定到提供的值( ie ng-model
)的一个可能原因是您要替换整个wk-location-suggest-new
元素,其中包含编译的新自定义location3
元素,其中已隔离 DOM
指令本身。
由于指令DOM
具有隔离范围,因此范围完全不了解scope
,因为wk-location-suggest-new
(和所有其他位置值)是在location3
的范围内定义,而不是指令本身的范围;因此,您最终会将输入的值绑定到location3
属性。
MainCtrl
答案 1 :(得分:1)
您需要在setTimout()
中更新您的模型,如下所示,因为指令中有一个独立的范围。
setTimeout(function () {
scope.$apply(function () {
scope.location3 = 'Your selected value'
});
}, 2000);
或者,您也可以使用$timeout
服务来获得相同的结果。