在$作用域上定义的变量直到下一个周期才更新
Variable defined on the $scope not updating until next cycle
这是一个活塞- http://plnkr.co/edit/PaG1k5N37BTOflObnN7K?p=preview
场景1:
步骤1—当"tags
"输入"m"时,建议显示"Marie
"。
步骤2—当输入"j"时,建议出现John
。
步骤3—再次输入"m",无建议。我已经在script.js
中实现了这个功能。这是完美的,因为Marie
是从$scope.to
中删除的,因为它已经在步骤1中添加到tags
输入框中。
场景2 :
步骤1—当tags
输入"m"时,建议显示Marie
。
步骤2 -再次输入"m"时,Marie
仍作为建议出现
因此,在tags
输入框中输入John
或Ghita
之前,Marie
一直作为建议出现。只要输入John
(例如上面的场景),Marie
就不再作为建议显示。
有人知道为什么会产生这种行为吗?
我试图使用$scope.$apply()
,但它给了我一个错误,说,一个$digest
周期已经在进行中。那么,当$scope.$digest()
已经在执行时,为什么$scope.to
变量没有得到更新?
您遇到了Typeahead库的问题。您将希望在$timeout
调用中包装添加的标记回调。
$scope.$on("decipher.tags.added", function(info, obj) {
$timeout(function(){
tagAdded(info, obj);
});
});
将解决这个问题。你可以看到,angular-tags指令本身在过滤内部标签列表时就是这样做的:
https://github.com/boneskull/angular-tags/blob/master/src/tags.js L69
编辑:这是你原来的Plunker的工作叉
我认为问题在于angular-tags库本身:https://github.com/boneskull/angular-tags/issues/28
看起来angular 1.2.0-rc.2以上的版本没有更新
正如另一位用户所说,这似乎是您正在使用的标签的当前版本的错误。一个临时的解决方法是使用$compile
来更新tagAdded
中的标记。要使用它,将$compile
作为参数与$scope
一起包含在emailViewController
中,并将其作为依赖项与$scope
一起注入底部。之后,可以调用
$compile(document.getElementsByTagName("tags")[0])($scope);
来更新它。这样做的一个副作用是,每次添加标签时,输入区域都会失去焦点,这可能会或可能不会对应用程序的可用性产生很大影响。
参考http://plnkr.co/edit/UVELXnrjOKasRnuGVA0e?p=preview获得使用$compile
你可以尝试使用$timeout
$timeout(function(){//你的代码});在angular中,$timeout强制你的摘要更新你的变量,而且它不会抛出一个摘要已经在进行中的错误。
try this:
if(!$scope.$$phase) {
$scope.$digest();
}
美元范围。$$phase是一个当angular处于$digest循环时设置为true的标志
- 滚动到容器中的下一个元素-几乎到了
- 后焦点更改为IE 11中的地址栏,而不是转移到表单中的下一个控件
- 使用CSS或js,使用动态选择器选择任意li的下一个元素
- 使用ajax将数据从一个步骤发送到下一个步骤的3步表单
- AngularJS&JSON-从Previous&下一个对象
- 使用向下箭头键(与tab键一样)聚焦下一个输入
- 来自文档或下一个静态父级的事件委派
- angularjs移除焦点上的活动类并添加到下一个项目
- 禁用旋转木马中的下一个按钮和上一个按钮
- 当按下一个键时,请多次按下不同的键
- 正在加载下一个帖子
- 构建JS测试,警报窗口重复上一个Q,而不是问下一个Q
- 删除“;上一个“;以及“;下一个“;基于当前幻灯片
- 真正的下一个具有特定类的元素
- 如何使用javascript获取下一个/转发url
- jQuery转盘下一个元素没有滑入
- 简单的垂直上一个和下一个按钮代码点击上下移动jQuery
- 按下一个HTML按钮,该按钮使用一个功能在同一个新窗口中打开URL
- 算法:从数组(javascript/angular)中按当前日期获取上一个和下一个事件
- 在$作用域上定义的变量直到下一个周期才更新