【问题标题】:Display AngularStrap Dropdown Manually - How?手动显示 AngularStrap 下拉菜单 - 如何?
【发布时间】:2014-05-11 14:13:47
【问题描述】:

我正在尝试手动显示AngularStrap dropdown,利用$dropdownProvider 上的trigger 配置

// how dropdown is triggered - click | hover | focus | manual
app.config(function($dropdownProvider) {
    angular.extend($dropdownProvider.defaults, {
        trigger: 'manual'
    });
});

click hover focus 一切正常,但为什么不是manual?我还没有发现任何证据证明这个提供的 api 配置选项有效。我该怎么做?

事实上,这个问题似乎是在我最初提出问题后发现的,但现在已关闭,一年多后我仍未找到解决方案。

问题:Documentation on how to use trigger=manual is missing

我已经举出一个例子来说明我在哪里挣扎。为了阐明我的目标,我想通过击键(ng-model 更改)触发我的<textarea> 中的下拉菜单。我希望保留下拉菜单并调用一个函数来手动触发它,而不使用任何默认触发选项,特别是trigger: manual,并以一种直观的方式这样做,应该根据 api 提供,所以所需的解决方案不应局限于任何特定的触发器 - 而是完全手动以适应许多不同的用途。

Plunker Link


<textarea ng-model="expression" intellisense></textarea>

app.directive('intellisense', [function () {
    return {
        restrict: 'A',
        link: function (scope, elem, attrs) {
          scope.$watch(attrs.ngModel, function (v) {
                if(v) {
                  // how do I trigger dropdown here on keystroke (model change)?
                }
            });
        }
    }
}]);

【问题讨论】:

    标签: javascript html angularjs angularjs-directive angular-strap


    【解决方案1】:

    对于任何感兴趣的人,在挖掘源代码后,我发现指令bsDropdown 上的一个属性称为bsShow,具有以下实现。

    // Visibility binding support
    attr.bsShow && scope.$watch(attr.bsShow, function(newValue, oldValue) {
        if(!dropdown || !angular.isDefined(newValue)) return;
        if(angular.isString(newValue)) newValue = !!newValue.match(/true|,?(dropdown),?/i);
        newValue === true ? dropdown.show() : dropdown.hide();
    });
    

    这实质上会驱动下拉标记包含此内容并绑定到 $scope

    <textarea id="textdrop" ng-model="expression" intellisense bs-dropdown="dropdown" bs-show="drop"></textarea>
    

    然后在我的指令中,我可以通过将$scope.drop 修改为绑定在bs-show="drop" 上来触发可见性

    app.directive('intellisense', [function () {
        return {
            restrict: 'A',
            link: function (scope, elem, attrs) {
              scope.$watch(attrs.ngModel, function (v) {
                    if(v) {
                      scope.drop = true; // simple - but works
                    } else {
                      scope.drop = false;
                    }
                });
            }
        }
    }]);
    

    这似乎记录在项目提交中,引用为here。在撰写本文时,官方文档仍然没有提到这一点,考虑到时间线,我很惊讶它没有受到关注。

    Plunker Linktrigger: manual

    【讨论】:

    • @davidkonrad 感谢您的积极反馈!太糟糕了,我付出了一笔赏金,最终还是沉迷于此,哈哈
    【解决方案2】:

    当我有上面的下拉菜单并想手动触发它时,我将id 添加到元素:

    <button id="myDropdown" type="button" class="btn btn-lg btn-primary" data-animation="am-flip-x" bs-dropdown="dropdown">
        Click to toggle dropdown
    </button>
    

    然后简单地触发元素click()方法:

    $scope.dropdown = angular.element("#myDropdown");
    ...
    $scope.dropdown.click();
    

    演示 -> http://plnkr.co/edit/v5AuBOiMN6TZCPE4eYk2?p=preview

    这可以与angular-hotkeys 结合使用:

    hotkeys.bindTo($scope)
        .add({
            combo: '<key-combination>',
            description: '<description>',
            callback: function() {
                $scope.dropdown.click()
            }
        })
    

    【讨论】:

    • 你能为此制作一个 plunk 吗?我仍然无法获得手动触发器来触发下拉菜单。该文档完全缺乏,根据this issue 听起来manual 甚至不应该是API 的一部分,如果涉及到这个
    • 我也对问题进行了编辑。在这一点上,我不太关心绑定一个关键配置——但是很好的建议。我只是想以某种方式触发下拉菜单
    • @salniro 查看此 plnkr -> plnkr.co/edit/v5AuBOiMN6TZCPE4eYk2?p=preview 它会在页面加载后 1 秒按上述代码打开一个下拉列表。
    • 这仍然不是我的目标。这没有使用trigger: manual 配置。我不想使用click,理想情况下,我想在我的&lt;textarea&gt; 示例中触发击键下拉菜单
    • @salniro,是的 - 你只需在你的(现已删除的)指令中调用 $scope.dropdown.click(),通过热键或在发生所需击键时的任何其他方式。
    【解决方案3】:

    使用 v2.0.4 的 ngStrap 现在手动触发日期选择器(或任何下拉菜单)要容易得多。详情请见this Github comment

    这里是 a working plunk to demonstrate 日期选择器,既可以作为手动触发的下拉菜单,也可以作为手动触发的内联元素。

    <input type="text" ng-model="dropdownDatepicker.date" bs-datepicker data-trigger="manual" data-bs-show="dropdownDatepicker.show">
    

    (而且你真的不需要data-trigger="manual",所以如果你愿意,你可以不用它)。

    至于智能感知指令,这听起来不像这里的问题,所以我将把它留给你......

    【讨论】:

    • 这很好,但您回答的是另一个问题 - 发帖人询问了下拉菜单。
    • 我的回答是有效的,我只是使用了一个日期选择器作为示例。日期选择器下拉菜单。它对任何下拉菜单的工作方式完全相同,如接受的答案所示,它与我的解决方案相同(使用bs-showdata-bs-show)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    • 2021-04-21
    • 2013-08-12
    相关资源
    最近更新 更多