打开AngularUI Bootstrap Typeahead通过Controller匹配结果

时间:2016-12-07 20:30:46

标签: angularjs angular-ui-bootstrap angular-ui bootstrap-typeahead angular-ui-typeahead

无论如何都要触发从控制器打开输入文本框的匹配结果?

用例:

显然,在输入文本框中输入时,我似乎只能获得预先输出结果。

1 个答案:

答案 0 :(得分:0)

我让它以几种方式工作,但两者都需要更改ui-bootstrap。我想我可以创建一个pull请求,但不确定我的特定用例是否是常见用例。

1)自定义指令和调用UibTypeaheadController.scheduleSearchWithTimeout方法对输入元素的焦点。

指令:

.directive("showSearchResultsOnFocus", function($stateParams) {
return {
    require: ['uibTypeahead', 'ngModel'],
    link: function (scope, element, attr, ctrls) {
        var typeaheadCtrl = ctrls[0];
        var modelCtrl = ctrls[1];

        element.bind('focus', function () {
            if (!$stateParams.search || !modelCtrl.$viewValue) return;
            typeaheadCtrl.exportScheduleSearchWithTimeout(modelCtrl.$viewValue);
        });
    }
}

更新到ui-bootstrap:

this.exportScheduleSearchWithTimeout = function(inputValue) {
  return scheduleSearchWithTimeout(inputValue);
};

错误:需要在控制器上公开方法。只有可用的方法是init方法,并且范围是隔离的。不打算从外部控制器打电话。

2)添加新的typeahead属性以允许设置默认值并在焦点上显示结果:

更新到ui-bootstrap:

var isAllowedDefaultOnFocus = originalScope.$eval(attrs.typeaheadAllowDefaultOnFocus) !== false;
originalScope.$watch(attrs.typeaheadAllowedDefaultOnFocus, function (newVal) {
  isAllowedDefaultOnFocus = newVal !== false;
});

element.bind('focus', function (evt) {
  hasFocus = true;
  // this was line before: if (minLength === 0 && !modelCtrl.$viewValue) {
  if ((minLength === 0 && !modelCtrl.$viewValue) || isAllowedDefaultOnFocus) {
    $timeout(function() {
      getMatchesAsync(modelCtrl.$viewValue, evt);
    }, 0);
  }
});

错误:将请求拉到ui-bootstrap,但可能不会改变常用的功能。在这里提交了一个PR:https://github.com/angular-ui/bootstrap/pull/6353不确定是否合并,但在此之前使用fork。

还有其他建议吗?

<强>版本 Angular:1.5.8,UIBS:2.2.0,Bootstrap:3.3.7