【问题标题】:angularjs JSON object filter select optionangularjs JSON对象过滤器选择选项
【发布时间】:2015-10-26 22:38:36
【问题描述】:

我在使用选择选项元素按定义的类别过滤 JSON 条目时遇到问题。非常感谢任何帮助。

我的应用应该做什么:

  1. 通过 http.get(工作)从文件中加载 JSON 数据
  2. JSON 数据包含每个条目的职位名称和职位类别(以及其他数据)
  3. 将这些条目中的每一个从 JSON 读取到 html 上的列表标记中(工作)
  4. 通过选择选项元素按工作类别过滤此列表(无效)

我猜问题出在我的控制器功能的某个地方。但我对 angularjs 很陌生,所以我无法找出问题所在......非常感谢任何帮助。

我的 JSON 文件的前两个条目带有“类别”标签:

   [{
    "jobtitle":"Multimedia Producer",
    "name":"A. Text",
    "shortname":"atext",
    "shortdescription":"Werbeagentur",
    "team":"XXX",
    "lookingfor":"XXX",
    "jobdescription":"XXX",
    "portfolio":"XXX",
    "contact":"XXX" ,
    "categories":"none"
   },
   {
    "jobtitle":"Kameraassistent",
    "name":"Movie & Art",
    "shortname":"movie_art",
    "shortdescription":"Corporate Movies and more...",
    "team":"XXX",
    "lookingfor":"XXX",
    "jobdescription":"XXX",
    "portfolio":"XXX",
    "contact":"XXX",
    "categories":"photography"  
   }]

controller.js:

var myApp = angular.module('myApp', []);
myApp.controller('MyController', ['$scope', '$http', function ($scope, $http){
    $http.get('js/data.json').success(function(data){
    $scope.jobs = data;
    $scope.catchange = 'categories'
    }); 
}]);

带有选择选项元素的 HTML 页面设置的一部分:

<div ng-controller="MyController">
    <span class="input">
        <select ng-model="catchange" class="cs-select cs-skin-underline">
            <option value="none">Suche nach Kategorien</option>
            <option value="photography">Fotografie</option>
            <option value="text">Text</option>
            <option value="digital">Digital</option>
            <option value="print">Print</option>
            <option value="consulting">Beratung</option>
            <option value="advertising">Werbung</option>
            <option value="socialmedia">Social Media</option>
            <option value="strategy">Strategie</option>
            <option value="conception">Konzeption</option>
            <option value="film">Film</option>
            <option value="tv">TV</option>
        </select>
    </span>
</div>

<div class="searchlisting" ng-controller="MyController">
    <ul class="portfolio-grid">    
        <li class="grid-item" ng-repeat="item in jobs | filter: catchange" data-jkit="[show:delay=300;speed=500;animation=fade]">
            <img ng-src="img/searchlist/{{item.shortname}}_tn.jpg" alt="Photo of {{item.name}}">
            <a class="ajax-link" href="single.html">  
                <div class="grid-hover">
                    <h1>{{item.jobtitle}}</h1>
                    <p>{{item.name}}</p>
                </div>
            </a>  
        </li>
    </ul>
</div>

非常感谢您的帮助。

干杯

【问题讨论】:

  • 我不明白这条线应该代表什么? $scope.catchange = 'categories'。您实际上是将过滤器设置为字符串'categories',这甚至不是选择列表中的有效选项。
  • 是的,我认为这就是问题所在。谢谢克莱斯。我该如何解决这个问题,它需要相应的条目?抱歉 - 我是 Angular 新手...
  • 它应该做什么:用户在选择列表中选择一个条目(类别),然后角度将只显示 JSON 文件中的相应条目(=类别标签)。 guidokoch.ch/jobplattform/jobsuche.html
  • 好的,让我们分解一下您在这里尝试做的事情。您的服务正在获取作业列表,并且您希望根据下拉列表过滤它们。为什么您甚至需要在收到数据时将下拉列表的值设置为任何值?
  • 好的,重新加载浏览器后,我可以使用下拉菜单了;但是检查控制台,您的服务似乎正在抛出 404 来获取您的数据,并且没有任何要过滤的内容。

标签: javascript json angularjs html-select


【解决方案1】:

catchange 将是一个字符串,当您进行过滤时,您将遍历作为作业的每个对象。所以真的,您需要将每个 job.categories 与 catchange 模型进行比较。

因此,当您执行 filter:catchange 时,您将每个作业对象与 catchange 中的选定字符串进行比较,您需要将 job.categories 与 catchange 进行比较。您可以告诉 Angular 跟踪迭代器的内容以确保它正在比较,或者您可以执行以下操作:

编写一个返回布尔值的过滤器函数。这只是一种方式

这将是视图中的过滤器,角度将每个作业作为参数传递

filter: filterCategory

这将是控制器中的一个函数,需要将传入的作业类别与需要过滤掉的类别进行比较。让它返回一个布尔值。

$scope.filterCategory = function(job){
    return $scope.catchange.filter(category){
      job.categories === category
    }
}

edit:上面假设了多选选项,其中 catchange 是通过字符串存储的选定选项数组。如果它只是一个单一的类别选择然后

$scope.filterCategory = function(job){
    if($scope.catchange){
        return job.categories === $scope.catchange
    } 
    else {
        return true
    }
}

【讨论】:

  • 感谢 Georgette 的回答和解释。我知道我做错了什么......不知何故,你的符号给了我一个语法错误 - 所以我的控制器现在看起来像这样: var myApp = angular.module('myApp', []); myApp.controller('MyController', ['$scope', '$http', function ($scope, $http){ $http.get('js/data.json').success(function(data){ $ scope.jobs = data; $scope.filterCategory = (function(job){ return job.categories === catchange }); }); }]);
  • 很难读懂,但我确实有语法错误(在声明函数时使用 : 而不是 =)。请参阅上面的修复。
  • 感谢您的修复!不过我无法解决问题 - 我可以再次向您寻求帮助吗?我从页面中剥离了所有的 css 和其他 js,看看是否有东西干扰了应用程序。但事实并非如此。所以我在我的服务器上上传了这个剥离版本:link你能看一下吗?非常感谢!
  • 好的,我浏览器中的控制台说“catchange”没有定义。我想我需要在控制器中定义它 - 但是如何?
  • 只需将其初始化为空字符串:$scope.catchange = '';然后当用户实际在下拉列表中选择一个选项时,$scope.catchange 将捕获该值,然后 Angular 将检测模型更改并重新过滤。
【解决方案2】:

尝试指定要过滤的属性名称:

<li class="grid-item" ng-repeat="item in jobs | filter: {categories: catchange}" data-jkit="[show:delay=300;speed=500;animation=fade]">

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-21
  • 2015-06-24
  • 2015-10-21
  • 1970-01-01
  • 2013-05-25
相关资源
最近更新 更多