angularjs - Angular 指令协作

标签 angularjs angularjs-directive angularjs-scope angularjs-ng-repeat

因此,我在这里尝试使用 Angular 实现自动完成建议,我需要您的专业知识。

这是 html:

<div my-autosuggest>
    <input type="text" my-autosuggest-input>
    <ol>
         <li ng-repeat"item in items" my-autosuggest-list>...</li>
    </ol>
</div>

我不想使用模板生成<li>元素。 (我希望它能够灵活地以任何顺序使用任何类型的元素,并且可能在列表和下拉列表之间使用一些其他额外的元素)

困难的部分是响应输入上的箭头键以突出显示列表中的下一个/上一个元素。我如何让其他指令 my-autosuggest-list知道它应该从 my-autosuggest-input 选择下一个元素指令。

请注意,我可能在一个 Controller 中有多个自动建议,如下所示:

<div ng-controller="MyController">
   <div my-autosuggest>
       <input type="text" my-autosuggest-input>
       <ol>
            <li ng-repeat"item in items" my-autosuggest-list>...</li>
       </ol>
   </div>
   <div my-autosuggest>
       <ol>
            <li ng-repeat"item in items" my-autosuggest-list>...</li>
       </ol>
       <input type="text" my-autosuggest-input>
   </div>
</div>

到目前为止,我已尝试 $watch对于索引更改,但有时不会为列表中的某些元素调用监视(也许这是一个错误)。 $broadcast 不起作用,因为输入可能被包装在另一个 Controller 中或另一个元素内,因此列表不会听到广播。

我还尝试在根范围中为每个自动建议放置一个变量,但调用指令的顺序并不总是从父级到子级,因此我无法初始化该变量并每次创建一个新变量 my-autosuggest被调用是因为 my-autosuggest-input或者在此之前可能会调用其他人。

任何有关如何使用 Angular 进行设计的建议都将受到赞赏。

最佳答案

假设 my-autosuggest-inputmy-autosuggest-list 始终位于 my-autosuggest 内。您可以使用一系列 $emissed$broadcast 事件来完成此操作。

my-autosuggest-input 的链接函数中添加按下箭头键时的 $emit:

element.on('keyup', function () {
   // Figure out if this is an arrow key, if so:
   $scope.$emit('listSelect', { message: 'prevItem' }); // Or 'nextItem'
});

my-autosuggest链接函数或 Controller 中添加:

// Add a controllerId, so that the listener doesn't handle its own events.
$scope.controllerId = Math.random().toString();
$scope.$on('listSelect', function (e, data) {
    if ($scope.controllerId !== data.controllerId) {
        $scope.$broadcast('listSelect', { 
            controllerId: $scope.controllerId,
            message: data.message 
        });
    }
});

最后,在my-autosuggest-list的链接函数或 Controller 中添加:

$scope.$on('listSelect', function (e, data) {
    if (data.message === 'nextItem') {
        // Highlight next item.
    } else {
        // Highlight previous item.
    }
});

在此场景中,my-autosuggest 将任何 listSelect 事件从其任何子级路由到其所有子级。

关于angularjs - Angular 指令协作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16341750/

相关文章:

angularjs - Angular + Node + Express + Passport + oauth2orize 独特的 CORS 问题

javascript - 构建 Node.js 和 AngularJS 应用程序

javascript - 以 Angular 形式将一个输入字段值连接(追加)到另一字段

angularjs - 使指令函数在父范围内可访问而无需事件

javascript - $scope.$on 使用传递的值

javascript - 带有 angularjs 的 Internet Explorer 中的 Blob url

javascript - angularjs checkbox onchange 在表单中不起作用。$pristine

javascript - AngularJS - 将 $setValidity 与 ng-repeat 指令一起使用

javascript - 如何在没有Google SDK的情况下使用key脚本在angularjs中使用谷歌地图

angularjs - 为什么在使用 collection-repeat 而不是 ng-repeat 时不显示列表