2013-04-14 42 views
2

我经历了AngularJS教程,它非常整齐。我也深入了Backbone和Ember.js(虽然不完全熟悉),但是我已经听到了AngularJS的很多赞誉,我想看看它是否适用于我。有没有AngularJS数据更新回调?如何在数据更改时手动更新页面?

我有一个专注于大型谷歌地图的网站(想想Padmapper.com之类的东西)。超过2000辆目前通过JSON加载的汽车,并且JSON需要1-2秒才能到达。然后在地图上填充基于汽车位置的标记。我有一个过滤器窗体,用户可以根据许多不同的属性过滤汽车(让我们只说颜色,气体量等)。目前提交这个过滤器表单用过滤器查询后端,然后过滤器返回过滤后的汽车。这是一个巨大的时间浪费。

我想加载初始化的所有项目,然后使用前端进行过滤,因为它们更改值。在AngularJS教程中,当我在过滤器框中输入内容时,项目出现并消失。很酷。但我如何处理地图标记?我如何定义一个回调函数来手动更新地图标记?我需要使用自定义指令吗? (仍然不完全确定这些做什么...)

我可以想到jQuery的一个解决方案,即有一个无序列表的汽车,观察它的变化,并根据需要隐藏/显示标记。但我试图摆脱jQuery。任何帮助表示赞赏!谢谢!

回答

7

在指令中,您可以$查看您的汽车列表中的更改并重新应用地图上的标记。我不熟悉的谷歌地图程序,但在这里是企图说明我讲:http://plnkr.co/edit/d8Dn6epgnQ9UvWrMDAk8?p=preview

编辑

我发现跟踪的筛选结果的一个好方法:

<tr ng-repeat="item in (filteredcars = (cars | filter: query))"> 

这个动态创建变量filteredcars并且不需要绑定输入查询上的更改事件!

所以回顾:

1)您可以$观看数据的变化。但不要忘记第三个参数来告诉它是一个数组。

scope.$watch('myvar', function(newval, oldval) {...}, true); 

2)您可以即时创建包含来自ng-repeat的表达式的过滤结果的变量。

3)不要忘记在追加子元素之前清空地图元素,否则过滤后的元素看起来不起作用。

+0

太棒了,谢谢你的回答和演示。我尝试在页面中放置''并按照过滤列表,但“地图”区域不变。我想'$ watch'在这里看着整个汽车的目标,而不是过滤汽车。我将如何能够纳入这些过滤器? –

+0

我会尝试一些并让你知道。 – jpmorin

+0

是否可以将过滤后的汽车对象保存在作用域中,如'$ scope.filteredCars'?就像过滤器表单的所有更改一样 - >重新指定filteredCars。然后地图观看filteredCars并根据需要处理更改?也许这是一种可以更容易处理的迂回方式。感谢大家看看这个 –