因此,我尝试为文本输入构建自定义自动完成下拉列表。要做到这一点,我正在听keydown事件,如果按向上或向下箭头,我将$scope.arrowSelectedItem
变量设置为列表中的正确变量。 (作为旁注,所有功能都可以从弹出的列表中选择一个项目。我尝试做的只是突出显示他们用向上/向下箭头标记的当前项目。 )。
在标记方面,自动填充列表中的项目使用ng-repeat
输出,ng-repeat="item in itemList"
。我使用的ng-class
表达式为ng-class="{highlighted: item === arrowSelectedItem}"
。我知道使用console.log正在每个箭头按下更新$scope.arrowSelectedItem
,但由于某种原因,该类没有正确更新到列表项。
我发现的是,在第一次按下箭头键后,如果我让文本输入框失去焦点,则添加该类。然后,如果我在框中单击后退,移动箭头以选择其他项目,单击输入框,然后单击返回,该类将添加到新项目中。我知道这听起来很奇怪,但那是我发现的。
我不确定的是为什么ng-class
表达式不会在每个箭头按键上进行评估。有没有人有任何想法?
答案 0 :(得分:6)
这里的答案是,在一个angular的内置指令之外触发的“原始”DOM事件(例如通过ng-click等点击事件)将不会触发$ digest循环更新。在此之前,$ scope属性将不会更新。
如果您正处于使用其他框架侦听DOM事件的位置,或者只是使用addEventListener(),则需要通过使用$ scope。$ apply()或者通过以下方式让角度知道任何更改。将代码包装在$ timeout()。
中如果在事件处理程序中执行此操作,angular将为每个按键触发新的$ digest循环更新,并且新的范围值将传播到视图。