在最高级别的范围内,我从服务器中获取了一些数据,以供整个页面使用,例如:$scope.lotsOfData = $http.get("lotsOfData");
。因此,现在我的作用域为lotsOfData
保存了一个promise对象。然后,在我的HTML中,我的指令仅与一小部分lotsOfData
对象有关。一个这样的指令可能看起来像这样:
<div>
{{lotsOfData.foo.blah[source].bar[id].someData}}<br>
{{lotsOfData.foo.blah[source].bar[id].otherData}}<br>
{{lotsOfData.foo.blah[source].bar[id].differentData}}
</div>
通过指令的属性设置源和ID的位置。我的HTML页面如下所示:
<data-subset source="1" id="1" />
<data-subset source="1" id="2" />
<data-subset source="2" id="1" />
<data-subset source="3" id="1" />
我讨厌在整个指令中重复
lotsOfData.foo.blah[source].bar[id]
。有什么方法可以在范围中进行设置,以便我的指令看起来更像这样?<div>
{{currObj.someData}}<br>
{{currObj.otherData}}<br>
{{currObj.differentData}}
</div>
这不仅会清理HTML,而且如果我们重新构造
lotsOfData
对象,那么只有一个地方可以更改它获取currObj
对象的方式。在我指令的链接函数中,我尝试了以下操作:link: function(scope, element, attrs) {
scope.currObj = scope.lotsOfData.foo.blah[attrs.source].bar[attrs.id];
}
但是,由于
lotsOfData
是Promise对象,因此它没有名为foo
的属性。我对promise对象的工作方式并不了解很多,所以也许我只需要知道如何获取所需的属性即可。我希望我在这里要完成的工作是有意义的,并且有人可以为我指出如何完成这项工作的正确方向。谢谢。
最佳答案
link: function(scope, element, attrs) {
scope.$watch('lotsOfData.foo.blah['+attrs.source+'].bar['+attrs.id+']', function(newVal, oldVal) {
scope.currObj = newVal;
}
}
这应该可以解决问题,您只需监视数据上的更改,然后将
currObj
设置为新值。