Angularjs处理承诺和模型

时间:2014-11-22 09:58:12

标签: javascript angularjs coffeescript

我想知道什么是最好的方法来解决在angularjs和promises中的模型之间的许多关系。请允许我举例说明,如果有更好的方法可以实现这一点,我会很感激您的反馈。

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()模型的整体承诺范围内1}}功能。

这是一种正确的方法吗?可能有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

可能有一个参数可以进行一次API调用,它会返回您需要的所有内容,但是另一种方式有令人信服的理由。没有一般规则。有关在此处组合API请求的更多详细信息:https://softwareengineering.stackexchange.com/q/252362/20893

假设API正如您所描述的那样,在加载Ayahs之前响应对Surah的第一次调用可能会有好处,但同样,还有其他令人信服的理由这样做。

如果Surah中的有用信息不依赖于Ayah,你可以渲染它,然后每次加载Ayah时,也会将其渲染到页面中(这需要更加小心地在界面中显示,显示加载旋转器在适当的情况下,优雅地处理错误等...)。

如果信息仅在完整加载时才有用,那么你现在拥有它的方式看起来非常合理。