随着SPA应用程序的增长,有些事情在Angular JS中变得不清楚。假设我们有一个包含很多引用实体的RDBMS数据结构,比如Country(id),State(id,countryId),City(id,stateId),Street(id,cityId)。AngularJS RDBMS数据处理最佳实践
我们需要在单个视图中渲染大部分视图,就像按照父节点递归分组的街道索引一样。我知道这不是很实际的例子,特别是考虑到我们真正的应用程序实体具有我们需要绑定的相互数据。
“最佳实践”将会如何?现在
,我们使用大量的NG-repeat的像这样的:
<ul>
<li ng-repeat="country in countryList">
{{ country.name }}
<ul ng-if="(stateList | filter:{countryId === country.id}).length">
<li ng-repeat="state in filterStatesByCountryId(country.id)">
{{ state.name }}
<ul ng-if="(cityList | filter:{stateId === state.id}).length">
<li ng-repeat="city in cityList | filter:{stateId === state.id}">{{ city.name }}</li>
</ul>
</li>
</ul>
</li>
</li>
filterStatesByCountryId(country.id)
相同stateList | filter:{countryId === country.id}
。
我们的应用程序必须有适当的绑定,因此如果street.name
属性在StreetService
中得到更新,该视图反映了此更改。因此$scope.streetList = StreetService.all
不是开箱即用的选项,而是$scope.streetList
,我们将有$scope.street = StreetService
,然后将其用作$scope.street.all | filter:{cityId: city.id}
。
必须说这看起来很可怕。
什么是最佳的性能和服务体系结构明智的呈现和显示这种数据列表的方式?
想法之一是将整个合并的实体层次结构存储到一个。因此那个拥有所有州,城市和街道的国家成为一个对象。然后country
实体将拥有states {Array.<StateEntity>}
属性,state {StateEntity}
将具有cities {Array.<CityEnity>}
属性等。但是,如果单个street.name
会更新,我们需要遍历整个country
数据对象以找到我们需要更新的街道,进行更新,然后重新 - 提供视图,或者只是有一个$scope.watch(expr, fn, true)
这将是一个复杂的层次结构的矫枉过正。
谢谢。
P.S.我们无法切换到NoSQL来存储数据。