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

时间:2015-08-27 18:19:33

标签: javascript angularjs angularjs-scope

这是一个吸虫 - 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仍会显示为建议。

因此,在John输入框中输入Ghitatags之前,Marie会一直显示为建议。输入John后(例如上述方案)Marie不再显示为建议。

有没有人知道造成这种行为的原因?

我尝试使用$scope.$apply(),但它给出了一个错误,表示$digest周期已在进行中。那么,当$scope.$digest()已经执行时,为什么$scope.to变量没有得到更新?

5 个答案:

答案 0 :(得分:1)

我认为问题是angular-tags库本身: https://github.com/boneskull/angular-tags/issues/28

对于角度大于1.2.0-rc.2的版本,似乎没有更新

答案 1 :(得分:1)

您遇到了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的working fork

答案 2 :(得分:0)

正如其他用户所说,似乎这是您正在使用的当前版本标签的错误。临时解决方法是使用$compile更新tagAdded中的代码。要使用它,请在$compileemailViewController中添加$scope作为参数,并将其作为依赖项与$scope一起注入底部。之后,您可以致电

$compile(document.getElementsByTagName("tags")[0])($scope);

更新它。这样做的副作用是每次添加标记时输入区域都会失去焦点,这可能会也可能不会对应用程序的可用性产生很大影响。

有关使用$compile

的演示,请参阅http://plnkr.co/edit/UVELXnrjOKasRnuGVA0e?p=preview

答案 3 :(得分:0)

您可以尝试使用$ timeout

$timeout(function(){//your code}); 
在角度$ timeout中强制您的摘要更新您的变量,并且它不会抛出正在进行的摘要错误。

答案 4 :(得分:-1)

试试这个:

if(!$scope.$$phase) {
    $scope.$digest();
}

$ scope。$$ phase是一个设置为true的标志,而angular是在$ digest循环中