11487 sujets

JavaScript, DOM et API Web HTML5

Bonjour,

Je développe une application simple (pour commencer) en AngularJS et j'ai un soucis car ma liste déroulante qui permet de choisir la liste des films par style, affiche en double les styles présents plusieurs fois dans mon fichier JSON. J'ai essayé plusieurs solutions mais rien ne fonctionne et je bloque là-dessus depuis un moment, il n'y a plus que ça (et peut être ajouts par après) pour terminer mon application et remplir mon fichier JSON, donc j'ai besoin d'aide urgemment.
Code html :

<div class="container">
	<div class="bloc-header">
		<a href="www.medialibrary.esy.es"><img ng-src="images/logo.png" alt="Logo Media Library" class="logo"/></a>			
		  <img ng-src="images/logo-complement.gif" alt="Logo complement"/>		
	</div>
	
	<div class="jumbotron">
		<input type="text" ng-model="query"/>
		<br>	
		<br>
		
		<select ng-model="styles" ng-options="media.style for media in medias track by media.style"></select>
		
		<div class="order">
			<p>
				<label><input type="radio" ng-model="direction" /> Croissant</label>
			</p>
				
			<p>
				<label><input type="radio" ng-model="direction" value="reverse" /> Décroissant</label>
			</p>	
		</div>				
	</div>

		<article class="media" ng-repeat="media in medias | filter : styles">
			
	<div class="jumbotron">
		<div class="media">
			<h2 id="title-movie">{{media.title}}</h2>
			<div class="media-left" >   
				<img ng-src="images/{{media.picture}}.png" alt="{{media.title}}" />
			</div>
				
			<div class="media-body" style="margin-top:15px;">				
				<p class="description">Style : {{media.style}}</p>
				<p class="description">Année : {{media.year}}</p>
				<p class="description">Durée : {{media.time}}</p>
				<p id="infos"><a class="link-info" href="#/detail/{{medias.indexOf(media)}}">Plus d'info</a></p>				
			</div>
		</div>
	</div>
</div>


Mon controler AngularJS

var mediaControllers = angular.module("mediaControllers", []);

mediaControllers.controller("listMedias", ['$scope','$http', function($scope, $http) {
	$http.get("js/data.json").success(function(datas){
		$scope.medias = datas;		
	});
	$scope.ordre = 'title'; 	

}]);

mediaControllers.controller("detailMedias", ['$scope', '$http', '$routeParams', function($scope, $http, $routeParams) {
	$http.get("js/data.json").success(function(datas){
		$scope.medias = datas;
		$scope.whichItem = $routeParams.itemId;

		if($scope.whichItem > 0) {
			$scope.prevItem = parseInt($scope.whichItem) - 1;
		} else {
			$scope.prevItem = $scope.medias.length - 1;
		}

		if($scope.whichItem < $scope.medias.length -1 ) {
			$scope.nextItem = parseInt($scope.whichItem) + 1;
		} else {
			$scope.nextItem = 0;
		}
	});

}])


Et mon fichier JSON :

[
	{
		"picture" : "la-malediction",
		"title" : "LA MALEDICTION",
		"year" : "1976",
		"time" : "1h41",
		"director" : "Richard Donner",
		"synopsis" : "Robert Thorn est ambassadeur des États-Unis à Londres. Plusieurs décès tragiques et étranges ont lieu dans son entourage. Keith Jennings, un photographe et le père Brennan finissent par convaincre Thorn que Damien, son fils de cinq ans, un orphelin aux origines obscures qu'il a adopté à sa naissance à l'insu de sa femme qui venait de faire une fausse couche, n'est autre que l'Antéchrist.",
		"style" : "Horreur",	
		"scenario" : "David Seltzer",
		"production" : "20th Century Fox",
		"music" : "Jerry Goldsmith",
		"score" : "7.5/10",
		"actors" : "Gregory Peck, Lee Remick, David Warner, Billie Whitelaw, Patrick Throughton, Harvey Stephens, Sheila Reynor, Martin Benson, Leo McKern, Tommy Duggan, Anthony Nicholls, Nicholas Campbell"
	},
	
	{
		"picture" : "volte-face",
		"title" : "Volte/Face",		
		"year" : "1997",
		"time" : "2h18",
 		"director" : "John Woo",
		"synopsis" : "1991 : le terroriste Castor Troy tente d'abattre son ennemi juré Sean Archer, agent du FBI. Au moment du tir, il rate Archer, mais abat accidentellement son fils. Six ans plus tard, Castor est repéré à Los Angeles. À la suite d'un violent affrontement à l'aéroport, Castor est plongé dans le coma par Archer. Ce dernier apprend que Troy a placé une bombe chimique en ville. Il prend le visage de Troy, grâce à une opération chirurgicale, afin d'infiltrer un pénitencier secret où est détenu Pollux, le frère de Castor, pour connaitre l'emplacement de la bombe. Entre-temps, Troy sort du coma et se fait lui-même greffer le masque d'Archer, puis tue tous ceux qui sont au courant de l'opération, volant ainsi le travail, la vie et la femme d'Archer. Livré à lui-même, privé de son identité, ce dernier décide de s'évader...",
		"style" : "Thriller",		
		"scenario" : "Mike Werb, Michael Colleary",
		"production" : "Paramount Picture",
		"music" : "John Powell",
		"score" : "9/10",
		"actors" : "Joh Travolta, Nicolas Cage, Joan Allen, Alessandro Nivola, Dominique Swain, Gina Gershon, Nick Cassavetes"
		
	},
	
	{
		"picture" : "la-fureur-du-dragon",
		"title" : "La fureur du dragon",		
		"year" : "1997",
		"time" : "2h18",
 		"director" : "John Woo",
		"synopsis" : "1991 : le terroriste Castor Troy tente d'abattre son ennemi juré Sean Archer, agent du FBI. Au moment du tir, il rate Archer, mais abat accidentellement son fils. Six ans plus tard, Castor est repéré à Los Angeles. À la suite d'un violent affrontement à l'aéroport, Castor est plongé dans le coma par Archer. Ce dernier apprend que Troy a placé une bombe chimique en ville. Il prend le visage de Troy, grâce à une opération chirurgicale, afin d'infiltrer un pénitencier secret où est détenu Pollux, le frère de Castor, pour connaitre l'emplacement de la bombe. Entre-temps, Troy sort du coma et se fait lui-même greffer le masque d'Archer, puis tue tous ceux qui sont au courant de l'opération, volant ainsi le travail, la vie et la femme d'Archer. Livré à lui-même, privé de son identité, ce dernier décide de s'évader...",
		"style" : "Kung-fu",		
		"scenario" : "Mike Werb, Michael Colleary",
		"production" : "Paramount Picture",
		"music" : "John Powell",
		"score" : "9/10",
		"actors" : "John Travolta, Nicolas Cage, Joan Allen, Alessandro Nivola, Dominique Swain, Gina Gershon, Nick Cassavetes"
		
	},
	
	{
		"picture" : "la-fureur-du-dragon",
		"title" : "La fureur du dragon",		
		"year" : "1997",
		"time" : "2h18",
 		"director" : "John Woo",
		"synopsis" : "1991 : le terroriste Castor Troy tente d'abattre son ennemi juré Sean Archer, agent du FBI. Au moment du tir, il rate Archer, mais abat accidentellement son fils. Six ans plus tard, Castor est repéré à Los Angeles. À la suite d'un violent affrontement à l'aéroport, Castor est plongé dans le coma par Archer. Ce dernier apprend que Troy a placé une bombe chimique en ville. Il prend le visage de Troy, grâce à une opération chirurgicale, afin d'infiltrer un pénitencier secret où est détenu Pollux, le frère de Castor, pour connaitre l'emplacement de la bombe. Entre-temps, Troy sort du coma et se fait lui-même greffer le masque d'Archer, puis tue tous ceux qui sont au courant de l'opération, volant ainsi le travail, la vie et la femme d'Archer. Livré à lui-même, privé de son identité, ce dernier décide de s'évader...",
		"style" : "Kung-fu",		
		"scenario" : "Mike Werb, Michael Colleary",
		"production" : "Paramount Picture",
		"music" : "John Powell",
		"score" : "9/10",
		"actors" : "John Travolta, Nicolas Cage, Joan Allen, Alessandro Nivola, Dominique Swain, Gina Gershon, Nick Cassavetes"
		
	}
	
]


Merci d'avance, les amis.
Modérateur
Hello,

Plusieurs choses :
- tu as une balise <article> non fermée,
- tu devrais arrêter d'utiliser le $scope et faire un objet dédié dans ton controller (avec this par exemple)
- travailler avec un service pour centraliser les appelles

Ce n'est que mon avis, mais ça te permettra de faire évoluer ton code plus facilement et de mieux comprendre Angular dans ses prochaines versions.

ps : pour les styles, je n'ai pas trop compris... Peux-tu faire une version online (sur https://plnkr.co/ par exemple)