2016-11-11 128 views
7

我正在采取一个早该过期的Angular研讨会,并试图将常规JQuery的页面转换为Angular功能。我坚持的一件事是用ng-click激活一个过滤器(至少我认为这是首选方法)。带角度的选项卡过滤

所以基本上我有一个画廊和一个菜单左侧的图库中的这些图像的类别(组)。小组根据左边的菜单显示。所以,4组(女孩,自然,音乐,空间)。图像被分成这些组。如果我按下女孩,我应该只看到小组中的图像:女孩,如果我按大自然,我只能看到群组中的照片:大自然等,如果我按全部,我应该看到他们。

嗯,它不工作。尽管我遵循这个How to filter a list in AngularJS using several links

这里是一个可视化的页面给一个想法

这里是我的代码

HTML

<div class="content-body" ng-controller="galleryController as panel"> 
    <div class="col-xs-12 col-md-3"> 
    <div class="content-sidebar"> 
     <div class="side-widget menu"> 
     <h4>Groups:</h4> 
     <div class="border-bottom"> 
      <ul ng-init="tab = 1" class="list-group"> 
      <li ng-class="{active:panel.isSelected(1)}"> 
       <a class="list-group-item" ng-click="panel.selectTab(1); groupFilter = {}">All <span 
              class="badge badge-primary">12</span></a> 
      </li> 
      <li ng-class="{active:panel.isSelected(2)}"> 
       <a class="list-group-item" ng-click="panel.selectTab(2); groupFilter ={group:'nature'}">Nature <span 
               class="badge badge-success">7</span></a> 
      </li> 
      <li ng-class="{active:panel.isSelected(3)}"> 
       <a class="list-group-item" ng-click="panel.selectTab(3)">Music <span 
               class="badge badge-danger">3</span></a> 
      </li> 
      <li ng-class="{active:panel.isSelected(4)}"> 
       <a class="list-group-item" ng-click="panel.selectTab(4)">Space <span 
               class="badge badge-info">2</span></a> 
      </li> 
      <li ng-class="{active:panel.isSelected(5)}"> 
       <a class="list-group-item" ng-click="panel.selectTab(5)">Girls <span 
               class="badge badge-warning">3</span></a> 
      </li> 
      </ul> 
     </div> 
     </div> 
    </div> 
    </div> 
    <div class="col-xs-12 col-md-9"> 
    <div class="gallery"> 
     <div> 
     <div class="col-xs-12 col-md-3" ng-repeat="gallery in galleries | filter:groupFilter"> 
      <a class="gallery-item" ng-href="{{gallery.img}}" ng-class="{true:'active',false:''}[checked]" 
       title="Nature Image 1" > 
       <div class="image"> 
        <img ng-src="{{gallery.img}}" alt="Nature Image 1"/> 

       </div> 
       <div class="meta"> 
        <strong>{{gallery.title}}</strong> 
        <span>{{gallery.desc}}</span> 
       </div> 
      </a> 
      <ul class="gallery-item-controls"> 
       <li><label class="check"><input type="checkbox" class="icheckbox" ng-model="checked" /></label></li> 
       <li><span class="gallery-item-remove"><i class="fa fa-times" ng-click="removeGalleryItem(galleryItem, $event)"></i></span></li> 
      </ul> 
     </div> 
     </div> 
    </div> 
    </div> 
</div> 

控制器,如果你需要看到它

app.controller('galleryController', ['$scope', '$http', function($scope, $http) { 
    $http.get('data/galleries.json').success(function(data){ 
     $scope.galleries = data; 
    }); 

    $scope.removeGalleryItem=function(gallery){ 
     var removedGallery = $scope.galleries.indexOf(gallery); 
     $scope.galleries.splice(removedGallery, 1); 
    }; 

    this.tab = 1; 

    this.selectTab = function(setTab){ 
     this.tab = setTab; 
    }; 

    this.isSelected = function(checkTab){ 
     return this.tab === checkTab; 
    }; 



}]); 

数据

[ 
{ 
    "img":"assets/images/gallery/girls-1.jpg", 
    "group": "girls", 
    "title": "Image 1", 
    "desc": "Description", 
    "link":"" 
}, 
{ 
    "img":"assets/images/gallery/girls-2.jpg", 
    "group": "girls", 
    "title": "Image 2", 
    "desc": "Description", 
    "link":"" 
}, 
{ 
    "img":"assets/images/gallery/girls-3.jpg", 
    "group": "girls", 
    "title": "Image 3", 
    "desc": "Description", 
    "link":"" 
}, 
{ 
    "img":"assets/images/gallery/music-1.jpg", 
    "group": "music", 
    "title": "Image 4", 
    "desc": "Description", 
    "link":"" 
}, 
{ 
    "img":"assets/images/gallery/music-2.jpg", 
    "group": "music", 
    "title": "Image 5", 
    "desc": "Description", 
    "link":"" 
}, 
{ 
    "img":"assets/images/gallery/music-3.jpg", 
    "group": "music", 
    "title": "Image 6", 
    "desc": "Description", 
    "link":"" 
}, 
{ 
    "img":"assets/images/gallery/music-4.jpg", 
    "group": "music", 
    "title": "Image 7", 
    "desc": "Description", 
    "link":"" 
}, 
{ 
    "img":"assets/images/gallery/music-5.jpg", 
    "group": "music", 
    "title": "Image 8", 
    "desc": "Description", 
    "link":"" 
}, 
{ 
    "img":"assets/images/gallery/nature-1.jpg", 
    "group": "nature", 
    "title": "Image 9", 
    "desc": "Description", 
    "link":"" 
}, 
{ 
    "img":"assets/images/gallery/nature-2.jpg", 
    "group": "nature", 
    "title": "Image 10", 
    "desc": "Description", 
    "link":"" 
}, 
{ 
    "img":"assets/images/gallery/nature-3.jpg", 
    "group": "nature", 
    "title": "Image 11", 
    "desc": "Description", 
    "link":"" 
}, 
{ 
    "img":"assets/images/gallery/nature-4.jpg", 
    "group": "nature", 
    "title": "Image 12", 
    "desc": "Description", 
    "link":"" 
}, 
{ 
    "img":"assets/images/gallery/nature-5.jpg", 
    "group": "nature", 
    "title": "Image 13", 
    "desc": "Description", 
    "link":"" 
}, 
{ 
    "img":"assets/images/gallery/nature-6.jpg", 
    "group": "nature", 
    "title": "Image 14", 
    "desc": "Description", 
    "link":"" 
}, 
{ 
    "img":"assets/images/gallery/nature-7.jpg", 
    "group": "nature", 
    "title": "Image 15", 
    "desc": "Description", 
    "link":"" 
}, 
{ 
    "img":"assets/images/gallery/space-1.jpg", 
    "group": "space", 
    "title": "Image 16", 
    "desc": "Description", 
    "link":"" 
}, 
{ 
    "img":"assets/images/gallery/space-2.jpg", 
    "group": "space", 
    "title": "Image 17", 
    "desc": "Description", 
    "link":"" 
} 
] 

以防万一你想知道什么是在控制器中。一个删除画廊项目也不工作,但这是另一个问题。还有一些功能可以将活动类添加到菜单中,以便显示它何时处于活动状态。

根据上面的教程,控制器中没有任何东西需要过滤工作,因为它全部包含在Angular中。

编辑
任何想法如何使从app.js文件中分离数据这filetering工作。

这是一个码簿的link。正如你可以看到它的工作原理,如果我把数据放在应用程序文件中,但不是当我远程它(因为它应该是)我需要建立一个工厂?在app.js注释掉数据和远程离开到包含JSON和图像的回购,看到它失败

enter image description here

+0

错误只是想你的代码在这里:https://jsfiddle.net/kqrpz2mq/工作方式和组=自然,你已经实现了只有一个魅力 – yunandtidus

+0

它确实让我很高兴看到最终过滤本质上没有错,但它仍然无法按预期工作。我添加了一个codepen,显示它在app.js文件中添加数据时工作,但当我连接到外部数据时失败。我需要将数据分开。最终这些数据将作为数据库 – LOTUSMS

回答

7

在OP的要求我加入这里的答案是相似我为另一个问题写了一篇文章。

注到OP - 也许编辑它,以便未来的读者不会混淆:-)


做一些研究,我认为这个问题是galleryController在您的标记定义的地方,但后图库中的元素不在控制器定义的位置。

参照http://joli.sitedev.online/#/gallery。在文件slidesController。JS那里galleryController定义我把一个破发在这里和代码暂停:

enter image description here

我也把一个破发点这里,但在一个删除按钮,当点击该代码不会暂停:

enter image description here

望着标记我看不到任何ng-controller="galleryController"迹象,所以我不能看到画廊ng-repeat如何填充:

enter image description here

也许是通过这个:

enter image description here

如果通过那就说明事情作为指令有其自己的控制器。任何进一步的信息将有所帮助,我相信我们可以清除这一点。

+0

保留点。你对另一个问题的回答适用于这个问题,但他们不是一回事。但是,可能来这里的人会发现这个答案对这个问题很有帮助。再次感谢芽! – LOTUSMS

1

这是因为交叉生产地

跨域资源共享(CORS)是一种机制,允许在网页上限制资源(如字体)从另一个域要求外域,从中资源来源。 1网页可以自由嵌入图像,样式表,脚本,iframe,视频。[2]某些“跨域”请求,特别是AJAX请求,由同一安全策略默认禁止。

如果Inspet你的浏览器,你可以看到cross orign

+0

http://plnkr.co/edit/ajiIESeZ8u0f0koa8LJt?p=info – nmanikiran