我想知道解决angularjs模型与promise之间的许多关系的最佳方法是什么。请允许我举一个例子,如果您有更好的方法可以实现这一点,请多多指教。Surah
有很多Ayahs
我的Surah
模型:
angular.module('qurancomApp')
.service 'Surah', (Restangular, userOptions, Ayah) ->
class Surah
constructor: (obj) ->
for key of obj
@[key] = obj[key]
getAyahs: (from, to) ->
self = @
@ayahs = Ayah.all
surah_id: @id, from: from, to: to
.then (ayahs) ->
self.ayahs = ayahs
@new: (id)->
return Restangular.one('surahs', id).get().then (data)->
return new Surah(data)
@all: ->
return Restangular.all("surahs").getList()
我的
Ayah
模型:angular.module('qurancomApp')
.service 'Ayah', (Restangular, userOptions) ->
# AngularJS will instantiate a singleton by calling "new" on this function
class Ayah
constructor: (obj)->
for key of obj
@[key] = obj[key]
@all: (hash) ->
Restangular.one('surahs', hash.surah_id).getList 'ayat',
content: userOptions.content, quran: userOptions.quran, audio: userOptions.audio
.then (data)->
ayahs = data.map (ayah) ->
# The ayah object is returned from Restangular and given all the properties that restangular gives it. For example, you can call
# ayah.save() or ayah.remove() which will make API calls accordingly. This is power and will be perserved when creating the Ayah object
return new Ayah(ayah)
return ayahs
和相应的控制器:
angular.module('qurancomApp')
.controller 'AyahsCtrl', ($scope, $routeParams, Surah) ->
rangeArray = $routeParams.range.split("-")
Surah.new($routeParams.id).then (surah) ->
$scope.currentSurah = surah
console.log $scope.currentSurah.getAyahs(rangeArray[0], rangeArray[1])
真正的问题是:在控制器中,我调用函数
Surah.new()
,然后继续该函数并从后端获取该Surah
,然后要创建与之关联的Ayahs
,然后将Ayah
模型注入其中Surah
模型,并在Ayah
模型的总体承诺范围内,对Surah
模型中正在消化的Surah.new()
模型有一个承诺。这是正确的方法吗?会有更好的方法吗?
最佳答案
可能有一个参数可以进行一个API调用,该调用返回您需要的所有内容,但是有其他原因却有令人信服的理由。没有一般规则。有关在此处合并API请求的更多详细信息:https://softwareengineering.stackexchange.com/q/252362/20893
假设API就像您所描述的那样,在加载Ayah之前响应对Surah的首次调用可能会有好处,但是同样,也有令人信服的理由也需要这样做。
如果Surah中有不依赖Ayahs的有用信息,您可以进行渲染,那么每次加载Ayah时,也要将该信息渲染到页面中(这需要更小心地进入界面,在适当的位置显示加载微调器,优雅地处理错误等...)。
如果信息仅在整体加载时才有用,那么对我来说,您现在拥有的方式非常合理。