2015-09-29 55 views
1

我編輯調用數據對離子我的代碼如何使用API​​

.factory('ProductsService',['$ionicSideMenuDelegate', '$http', 'ApiEndpoint', '$ionicTabsDelegate', '$ionicSlideBoxDelegate', '$stateParams', 'AuthService', function($ionicSideMenuDelegate, $http, ApiEndpoint, $ionicTabsDelegate, $ionicSlideBoxDelegate, $stateParams, AuthService){ 
     var products = []; 
     var prod = []; 

     return { 
      GetProducts: function(){ 
      return $http.get(ApiEndpoint.url + '/products', {}).then(function(response){ 
       products = response.data.products; 
       return response; 
      }); 
      }, 
      GetProduct: function(productId){ 
       angular.forEach(products, function(product, key){ 
        $scope.prod = {}; //ERROR: $scope is not defined 
        if(product.id == productId){ 
        prod = product; 
        return product; 
       } 
       }) 
       return prod; 
     } 
     } 
     }]) 

..after我點擊錯誤appears..And頁面犯規顯示細節必須顯示的項目..

+0

您是否在尋找服務?有關此主題的許多以前的帖子:http://stackoverflow.com/questions/20181323/passing-data-between-controllers-in-angular-js http://stackoverflow.com/questions/12008908/angularjs-how- can-i-pass-variables-between-controllers http://stackoverflow.com/questions/22408790/angularjs-passing-data-between-pages – BatteryAcid

+0

你的GetProducts方法需要返回一個promise。目前它什麼都不做。把'$ http.get'改成'return $ http.get' –

+0

嗨@Andrew McGivery我編輯了我的問題你能幫我嗎?謝謝 – RH34Serenity

回答

2

我我不確定是否有你的問題。

實際上,每個視圖都有自己的控制器。所以在你的情況下,一個控制器的menu.html和產品頁面。當然,您也可以在兩個視圖中使用相同的控制器。 如果您想爲兩個視圖使用一個控制器,則控制器可以爲這兩個視圖提供數據。

如果您想爲每個視圖控制器,您必須共享控制器之間的數據。分享不同的控制器之間的數據,你可以找到很多的幫助: - Stackoverflow share data between controllers - Thinkster using services to share data between controllers

在兩種方案中,你不得不打電話給你的API在這個服務。爲此,您應該瞭解$ q和承諾的angularjs概念: Angularjs Documentation of $q

如果可以指定要從哪個頁面調用哪些數據到另一個頁面,我可以改進此答案。

編輯:

基於您的評論,我可以添加以下建議。在您的products.html中,您想顯示選定產品的詳細信息。這大致上說是一個主細節模式。你可以看看這個:Master-Detail-Pattern

您必須更改狀態配置併爲產品詳細信息添加狀態。類似的東西(你將不得不更改代碼):

.state('productDetails', { 
    url: "/product/:id", 
    templateUrl: 'templates/product.html', 
    controller: 'yourCtrl' 
}); 

在你的控制器,你可以得到給定的:ID在國家PARAMS:

var productId= $stateParams.id; 

爲了更好地實現它的工作原理也必須編輯你的menu.html。對於每個產品,您需要一個鏈接,如下所示:

<a href="#/product/{{product.id}}">{{product.name}}</a> 

這必須用ng-repeat包裝。但是,這一切都是在給定的頁面上描述的。

當然,還有其他的可能性來做你想做的。

+0

看到我的編輯答案,希望有所幫助。 – JSNorth

+0

Hi @ RH34Serenity, 你可以添加你的狀態代碼。某處您應該具有以下狀態配置: .state('productDetails',{ url:「/ product /:id」, templateUrl:'templates/product.html', controller:'yourCtrl' }) ; – JSNorth

+0

你搞砸了一些東西。 - http可以通過URL獲得產品頁面/:id不會變成任何東西。你應該仍然在這裏調用你的API - 問題在於這行:var productId = $ stateParams.id; $ scope.product = ProductsService.GetProduct(productId);僅在控制器實例化時調用一次。您現在可以爲該detailState編寫第二個控制器,並將它們連接在一起。 – JSNorth