我遇到以下问题。我有一个search.js
控制器,它使用模板results.html
。该模板使用类别指令来显示任何公司产品可能具有的所有类别(作为侧边栏)。它还使用多个产品轮播指令来显示每个匹配公司的产品。
在我的search.js
控制器中,我定义了一个名为filterCategoryId
的范围变量,该变量从null开始。此变量绑定到categories指令以及所有产品轮播指令。这使我期望在任何指令以及search.js
控制器中对此变量的更改将使用此变量传播给所有其他指令。该变量用于将产品的显示限制为仅属于该类别的产品。
但是在我的产品轮播指令中,我已经定义了一个范围方法removeFilterCategory()
,它将filterCategoryId
设置为null。它在自己的范围内工作。我可以看到效果。但它不会影响categories指令的filterCategoryId
。我可以告诉,因为我使用ng-class将active
类设置为列表项,提及过滤产品的类别ID。但是,将类别指令上的filterCategoryId
更改为会传播到产品轮播指令。 在产品轮播指令之前有一个ng-repeat ...
实质上。该变量首先在我的控制器范围内定义。如果我在categories指令上更改它,则更改会在产品轮播指令之后传播(在明显的时间之后)。但是,如果我从任何产品轮播项中更改它,则categories指令不会反映更改。而且我不明白为什么。 产品轮播使用$ watch来检查filterCategoryId
并重新计算其行..
所有指令都使用具有相同变量filterCategoryId
的隔离范围,并使用'='
作为范围值。
可能是什么问题?
即使我在categories指令上更改filterCategoryId
,也需要5-6秒才能反映产品轮播指令的变化。
我觉得我在这里遗漏了一些东西。要么我有一个明显的代码错误,我似乎忽略了,或者我错过了一些有棱有角的理解:)。非常感谢任何正确方向的帮助。
答案 0 :(得分:3)
我建议明确告诉AngularJS使用$scope.apply( function(){/*change var here*/});
注册更改,请参阅docs。
有一篇很好的文章解释了Angular的摘要周期的详细信息:http://jimhoskins.com/2012/12/17/angularjs-and-apply.html
如果您遇到延迟,这似乎是主要问题,但我也建议确保变量filterCategoryId
总是一个对象,因此它永远不会作为副本传递,也许将其更改为filter.CategoryId
等。