在$作用域上定义的变量直到下一个周期才更新

Variable defined on the $scope not updating until next cycle

本文关键字:下一个 周期 更新 变量 作用域 定义      更新时间:2023-09-26

这是一个活塞- 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输入框中输入JohnGhita之前,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的标志