2015-10-13 58 views
-1

我想鏈接的承諾,提取'dtaDashboard'使用從獲取儀表板的值,執行第二個電話。由於某種原因,承諾鏈似乎不能在「解決方案」內部發揮作用。爲什麼不?爲什麼我不能在「解決」路線中鏈接承諾?

state('uploadServiceTxData', { 
     url: '/dashboard/:id/upload', 
     templateUrl: 'views/dashboard-upload.html', 
     controller: 'DashboardUploadController', 
     resolve: { 
      dtaRefData: function(RefDataService) { 
       return RefDataService.getRefData(); 
      }, 
      dtaDashboard: function(DashboardService, $stateParams) { 
       return DashboardService.get({ id: $stateParams.id }); 
      }, 
      dtaUploads: function(TransactionSummaryUploadService, dtaDashboard, $q) { 
       return dtaDashboard.then(function(dashboard) { return TransactionSummaryUploadService.findByExample({ service: dashboard.service.name }) }); 
      } 
     } 
    }); 

上面的代碼部分的詳細信息。 DashboardSerivce和TransactionSummaryUploadService上的函數使用$ resource實現。所以「get」和「findByExample」使用$ resource來進行REST調用。

+0

我還沒有試圖複製你的問題,但你爲什麼不結合'dtaDashboard'和'dtaUploads'到一個解決方案?在承諾鏈的最後,您可以返回一個既包含儀表板又包含您需要的其他內容的對象。 – JoseM

+0

我認爲這是我會做的。請注意,問題是「爲什麼」這不起作用。 – user2800708

+0

如果說它不起作用,那你的意思是什麼?是否有錯誤被拋出?它從來沒有真正解決?你是否得到了比你期望的不同類型的對象? – JoseM

回答

0

它沒有工作的原因是服務是用$ resource實現的。 $ resource的方法不返回promise,它們返回一個包含promise的對象,以及其他一些東西。爲了達到承諾本身,我需要使用dtaDashboard。$ promise。

所以像這樣的代碼工作:

dtaDashboard: function(DashboardService, $stateParams) { 
    return DashboardService.get({ id: $stateParams.id }); 
}, 
dtaUploads: function(dtaDashboard) { 
    dtaDashboard.$promise.then(function(result) { ... /* result contains the data now. */ }); 
} 

回報DashboardService.get({ID:$ stateParams.id});

不從$資源服務返回承諾,它返回包含承諾(最終數據)的對象;該對象已解決,但不包含其包含的承諾。爲確保路由解析爲數據,這是可以做,而不是:

dtaDashboard: function(DashboardService, $stateParams) { 
    return DashboardService.get({ id: $stateParams.id }).$promise; 
} 

現在dtaDashboard將完全解決到哪裏它被注入的數據。

2

你非常接近。

dtaDashboard已注入datUploads時已解決。所以你使用解決的結果(意味着它不再是一個承諾)。

state('uploadServiceTxData', { 
    url: '/dashboard/:id/upload', 
    templateUrl: 'views/dashboard-upload.html', 
    controller: 'DashboardUploadController', 
    resolve: { 
     dtaRefData: function(RefDataService) { 
      return RefDataService.getRefData(); 
     }, 
     dtaDashboard: function(DashboardService, $stateParams) { 
      return DashboardService.get({ id: $stateParams.id }); 
     }, 
     dtaUploads: function(TransactionSummaryUploadService, dtaDashboard, $q) { 
      return TransactionSummaryUploadService.findByExample({ service: dtaDashboard.service.name }); 
     } 
    } 
}); 
+0

不,'dtaDashboard'尚未解決。 'dtaDashboard.service'未定義。 – user2800708

+0

問題也是「爲什麼」它不起作用。 – user2800708

+1

請閱讀ui-router文檔。承諾總是在注入之前得到解決。如果解決方案中的任何承諾被拒絕,狀態更改將中止。 「dtaDashboard.service」未定義的事實與ui-router無關。 – cgTag