9

情况

大家好!我正在为我的应用程序使用Angular ui-select以便从数据库中选择用户。如果用户不在列表中,则可以使用标记来输入新条目。

通过写入名称并按 ENTER 或 TAB,新条目将保存为新标签。

除了一件小事,一切都很好:如果我用鼠标集中注意力,我会丢失我输入的输入,这对用户不太友好。

代码

<h3>Array of objects</h3>
<ui-select multiple tagging tagging-label="new tag" ng-model="multipleDemo.selectedPeople" theme="select2" ng-disabled="disabled" style="width: 800px;">
  <ui-select-match placeholder="Select person...">{{$item.name}} &lt;{{$item.email}}&gt;</ui-select-match>
  <ui-select-choices repeat="person in people | propsFilter: {name: $select.search, age: $select.search}">
    <div ng-bind-html="person.name | highlight: $select.search"></div>
    <small>
      email: {{person.email}}
      age: <span ng-bind-html="''+person.age | highlight: $select.search"></span>
    </small>
  </ui-select-choices>
</ui-select>
<p>Selected: {{multipleDemo.selectedPeople}}</p>

柱塞

http://plnkr.co/edit/7fSAKmj3pLeeTaid4pMH?p=preview

问题

我如何设法将输入文本保存为新标签,不仅通过按 ENTER,还通过鼠标聚焦?

非常感谢!

4

2 回答 2

2

我已经分叉了 ui-select 并通过在 html 中的 ui-select 指令中添加 tag-on-blur='true' 来启用此功能。如果您愿意,您可以在我等待合并拉取请求时使用我的存储库。

https://github.com/mattmcardle/ui-select/tree/tag_on_blur

如果您使用我的 fork 并希望启用模糊标记,您的 HTML 代码将如下所示:

<h3>Array of objects</h3>
<ui-select multiple tagging tagging-label="new tag" tag-on-blur="true" ng-model="multipleDemo.selectedPeople" theme="select2" ng-disabled="disabled" style="width: 800px;">
  <ui-select-match placeholder="Select person...">{{$item.name}} &lt;{{$item.email}}&gt;</ui-select-match>
  <ui-select-choices repeat="person in people | propsFilter: {name: $select.search, age: $select.search}">
<div ng-bind-html="person.name | highlight: $select.search"></div>
<small>
  email: {{person.email}}
  age: <span ng-bind-html="''+person.age | highlight: $select.search"></span>
</small>
</ui-select-choices>
</ui-select>
<p>Selected: {{multipleDemo.selectedPeople}}</p>
于 2015-06-11T09:22:15.043 回答
2

只需创建一个指令。这处理点击外部选项卡并输入。

angular.module('module')
.directive('tagOnBlur', function($timeout) {
  return {
    require: 'uiSelect',
    link: function(scope, elm, attrs, ctrl) {

        scope.isTab = false;

        ctrl.searchInput.bind("keydown keypress", function (event) {
            if(event.which === 9 || event.which === 13) {
                event.preventDefault();
                scope.isTab = true;
            }
        });

        ctrl.bind('click', function (event) {
            scope.isTab = true;
        });

        ctrl.searchInput.on('blur', function() {
            if (scope.isTab){
                scope.isTab = false;
                return;
            }
            if ((ctrl.items.length > 0 || ctrl.tagging.isActivated)) {
                $timeout(function() {
                    ctrl.searchInput.triggerHandler('tagged');
                    var newItem = ctrl.search;
                    if ( ctrl.tagging.fct ) {
                        newItem = ctrl.tagging.fct( newItem );
                    }
                    if (newItem) ctrl.select(newItem, true);
                });
            }
        });
    }
  };
});
于 2017-08-31T21:02:45.243 回答