我想知道解决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时,也要将该信息渲染到页面中(这需要更小心地进入界面,在适当的位置显示加载微调器,优雅地处理错误等...)。

如果信息仅在整体加载时才有用,那么对我来说,您现在拥有的方式非常合理。

07-24 18:05