2016-11-18 1 views
0

Ich habe eine Homepage mit verschiedenen Produkten und möchte ein ausgewähltes Produkt in einer anderen Ansicht anzeigen. (die Detailansicht) Um die Produkte zu zeigen, verwende ich ng-repeat, die über ein Produkt-Array iterieren.Einen Artikel aus ng-repeat bekommen

Jetzt bekomme ich ein einzelnes Produkt aus der ng-Wiederholung, wenn ich einen Knopf klicke. Dann wechselt die Ansicht mit dem gewählten Produkt in die Detailansicht. Der Wechsel der Ansichten sollte über die ID gehen, da diese benötigt wird, um eine Anfrage an meine API zu stellen.

In diesem Zustand habe ich es mit $ routeParams versucht, aber es funktioniert nicht. Dann habe ich hier auf stackoverflow gesucht. Ich habe gelesen, dass es Scope-Problem sein könnte, weil ich versuche, die ID in einen Controller zu übergeben. (Und ich brauche diese ID in einem anderen Controller). Wenn ich auf den Button auf der Homepage klicke, passiert nichts.

Ich hoffe, dass jemand eine Idee hat, wie man dieses Problem löst.

Hier ist eine stample JSON-Datei der API:

{ 
    "_id": "582ae2beda0fd7f858c109e7", 
    "title": "Lorem ipsum", 
    "smalldescription": "Lorem ipsum dolor sit amet,", 
    "longdescription": "Lorem ipsum dolor sit ametLorem ipsum ", 
    "price": "2500", 
    "img": "Imagetxt" 
} 

Hier ist mein Code:

app.js

angular.module('Productportfolio', ['ngRoute']) 

.config(['$routeProvider', function ($routeProvider) { 

    $routeProvider 
     .when('/home', { 
      templateUrl: '/components/home/home.html', 
      controller: 'ProductCtrl' 
     }) 

     .when('/detail/:productId', { 
      templateUrl: '/components/detail/detail.html', 
      controller: 'DetailCtrl' 

     .otherwise({redirectTo: '/home'}); 
}]); 

home.html

<div ng-controller="ProductCtrl as ProductCtrl"> 
    <div ng-repeat="product in ProductCtrl.products "> 
     <h3>{{product.title}}</h3> 
      <button ng-click="loadDetail(product)">Detailansicht</button> 
     </div> 
    </div> 

ProductCtrl.js

angular.module('Productportfolio') 

.controller('ProductCtrl', ['APIService','$location', function (APIService,$location) { 

    var vm = this; 
    vm.products = null; 

    init(); 

    function init() { 
     APIService.getProducts() 
      .then(function (response) { 
       vm.products = response.data; 
      }) 
      .catch(function (error) { 
       console.log("error at GET"); 
      }); 
    } 

    vm.loadDetail = function(product){ 
     $location.path('/detail'+product.id); 
    } 
}]); 

APISvc.js

angular.module('Productportfolio') 

.service('APIService', ['$http', function ($http) { 

    var svc = this; 
    svc.root = 'http://localhost:3000/api'; 

    svc.API = { 
     'getProducts': getProducts, 
     'getProduct' : getProduct 
    }; 
    return svc.API; 

    function getProducts() { 
     return $http({ 
      method: 'GET', 
      url: svc.root + '/products' 
     }) 
    } 

    function getProduct(id){ 
     return $http({ 
      method: 'GET', 
      url : svc.root +'/product/'+id 
     }) 
    } 
}]); 

DetailCtrl.js

angular.module('Productportfolio') 

.controller('DetailCtrl', ['APIService', '$routeParams', function (APIService, $routeParams) { 


    var vm = this; 
    vm.product = null; 
    vm.productId = $routeParams.productId; 

    init(); 

    function init() { 
     APIService.getProduct(vm.productId) 
      .then(function (response) { 
       console.log(response); 
       vm.product = response.data; 
      }) 
      .catch(function (error) { 
       console.log("error at GET"); 
      }); 
    } 
}]); 
+0

Pfad in vm.loadDe überprüfen Tail() -Funktion. Ich denke, es ist $ location.path ('/ detail /' + product.id); – neelima

+0

Jahr, du hast Recht. Ich habe es geändert und nichts passiert, wenn ich auf den Button klicke. Und ich weiß nicht, ob der Ansatz richtig ist, das Produkt mit NG-Klick zu committen –

+0

Können Sie versuchen, den ng-Controller aus div zu entfernen? –

Antwort

0

Ersetzen Sie Ihre Moduldatei mit dieser dieser

angular.module('Productportfolio', ['ngRoute']) 

.config(['$routeProvider', function ($routeProvider) { 

    $routeProvider 
     .when('/home', { 
      templateUrl: '/components/home/home.html', 
      controller: 'ProductCtrl', 
      controllerAs: 'ProductCtrl' //modified as your using controller as syntax 
     }) 

     .when('/detail/:productId', { 
      templateUrl: '/components/detail/detail.html', 
      controller: 'DetailCtrl', 
      controllerAs : 'DetailCtrl'  //modify this also    

      //add these lines 
      param:{ 
      productId:null 
      } 
     } 

     .otherwise({redirectTo: '/home'}); 
}]); 

Ersetzen Sie Ihre ProductCtrl.js mit diesem

angular.module('Productportfolio') 

.controller('ProductCtrl', ['APIService','$location', function (APIService,$location) { 

    var vm = this; 
    vm.products = null; 

    init(); 

    function init() { 
     APIService.getProducts() 
      .then(function (response) { 
       vm.products = response.data; 
      }) 
      .catch(function (error) { 
       console.log("error at GET"); 
      }); 
    } 

    vm.loadDetail = function(product){ 
     $location.path('/detail/'+product._id); // you missed a slash and the property was wrong 
    } 
}]); 

ist dies der richtige $ location.path ('/ detail /' + product._id);

+0

was bedeutet" param: pruductId: null "? –

+0

@AmeLives hat den Beitrag aktualisiert. Bitte versuchen Sie es mit dem neuen. Wenn Sie das nicht richtig verstanden haben, lassen Sie es mich wissen! – Aravind

+0

Es funktioniert nicht. Ich denke es ist wegen "param: pruductId: null". Meine IDE zeigt mir einen Fehler, weil es erwartet, ein, pruductId ans null -> 'param: productId, null' –

1

Entfernen Sie den ng-Controller von div und aktualisieren Sie ihn wie folgt.

<div > 
    <div ng-repeat="product in vm.products "> 
     <h3>{{product.title}}</h3> 
     <button ng-click="vm.loadDetail(product)">Detailansicht</button> 
    </div> 
</div> 

Auch in Route-Konfiguration hinzufügen controllerAs: 'vm'

.when('/home', { 
    templateUrl: '/components/home/home.html', 
    controller: 'ProductCtrl', 
    controllerAs: 'vm' 
}) 

Aktualisieren Sie die Funktion wie

vm.loadDetail = function(product){ 
    $location.path('/detail'+product['_id']); 
} 
+0

Bedeutet es, dass ich den ng-Controller nicht brauche, weil es im Modul definiert ist, richtig? –

+0

Es ist bereits in der Routenkonfiguration angegeben. –

+0

Ok, aber die Ansicht ist nicht mit der Ansicht verbunden, weil ich eine weiße Seite habe und mit der ng-Steuerung bekomme ich die richtige Ansicht –

0

bearbeiten Wie @Paulson Peter sagte:

Remove ng-controller von div und Update wie unten.

<div > 
    <div ng-repeat="product in vm.products "> 
    <h3>{{product.title}}</h3> 
    <button ng-click="vm.loadDetail(product)">Detailansicht</button> 
</div> 

Auch in Route-Konfiguration hinzufügen controllerAs: 'vm'

.when('/home', { 
    templateUrl: '/components/home/home.html', 
    controller: 'ProductCtrl', 
    controllerAs: 'vm' 
}) 

Wie @ Aravind sagte:

vm.loadDetail = function(product){ 
    $location.path('/detail/'+product._id); //here is the change 
    } 

Jetzt kann ich das Produkt ein wechselt die Ansicht erhalten

+0

$ location.path ('/ Detail/'+ Produkt._ID); // hier ist die Änderung das ist die Lösung von mir !! – Aravind

+0

Jahr, du hast recht; Entschuldigung –

+0

Ich kann es nicht als eine Antwort markieren, weil ich mein eigenes bin und ich 2 Tage bis jetzt warten muss –