2017-08-07 89 views
-1

look this image to see the problem重复显示问题

我开发AngularJS一个简单的应用程序(开始),我有一个担心,因为我的下拉列表,允许通过风格来选择电影的名单,在我的JSON文件中多次显示样式。我已经尝试了几种解决方案,但没有任何工作,我阻止了一段时间,只有(并且可以添加后)完成我的应用程序并填充我的JSON文件。 JSON FILE:

[ 
    { 
     "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" 

    } 

] 



<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> 

controller ANGULAR JS

+0

请提供一些关于您想要实现的功能的代码,以便我们能够为您提供帮助。看看这个链接[如何在StackOverflow中做一个好问题](https://stackoverflow.com/help/how-to-ask)。 –

+0

不要将代码作为图像提供。把它放在这里,任何来帮助你的人都可以复制和粘贴来重现你的问题。 –

+0

我试过你的代码,我无法重现你的问题,对我来说一切工作正常,没有任何显示多次。请编写一段代码或[JSFiddle](https://jsfiddle.net/)以更好地理解您的问题。 –

回答

0

现在我得到了你的问题。那么,你可以使用Angular UI筛选器独特的

我找不到原始代码,但是我发现this fork

所以,你只需要添加过滤器:

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

/** 
* Filters out all duplicate items from an array by checking the specified key 
* @param [key] {string} the name of the attribute of each object to compare for uniqueness 
if the key is empty, the entire object will be compared 
if the key === false then no filtering will be performed 
* @return {array} 
*/ 
mediaControllers.filter('unique', function() { 

    return function (items, filterOn) { 

    if (filterOn === false) { 
     return items; 
    } 

    if ((filterOn || angular.isUndefined(filterOn)) && angular.isArray(items)) { 
     var hashCheck = {}, newItems = []; 

     var extractValueToCompare = function (item) { 
     if (angular.isObject(item) && angular.isString(filterOn)) { 
      return item[filterOn]; 
     } else { 
      return item; 
     } 
     }; 

     angular.forEach(items, function (item) { 
     var valueToCheck, isDuplicate = false; 

     for (var i = 0; i < newItems.length; i++) { 
      if (angular.equals(extractValueToCompare(newItems[i]), extractValueToCompare(item))) { 
      isDuplicate = true; 
      break; 
      } 
     } 
     if (!isDuplicate) { 
      newItems.push(item); 
     } 

     }); 
     items = newItems; 
    } 
    return items; 
    }; 
}); 

然后,你把过滤器上的ng-options

<select ng-model="styles" ng-options="media.style for media in medias | unique: 'style'"></select> 

我测试了它和它的工作。我希望它能解决你的问题。

UPDATE:

你也应该更新过滤器,以匹配所选项目风格而不是选定的对象。

<article class="media" ng-repeat="media in medias | filter : styles.style"> 
+0

它适合你吗?不适合我,我很难整合fork代码angular ui,我不知道在哪里包含这段代码,我把你的代码发给你。 –

+0

控制器修改: –

+0

它的工作,但还有一个问题,它显示只有一个按风格,并有超过2个电影按风格 –