如何将模板中的唯一ID与控制器中的过滤器函数匹配?

时间:2015-07-10 18:41:44

标签: javascript angularjs angularjs-scope

这是我的 app.js

.state('app.study_collections', {
    url: "/studies/:studynodeRef",
    views: {
      'menuContent': {
        templateUrl: "templates/rubyonic/overview.html"
      }
    }
})

以下是我的 studies.html

的摘录
<div class="feed-item">
  <div class="feed-media" ng-repeat="study in studies">
    <img src="{{study.image}}" class="feed-image">
    <div class="feed-gradient-overlay"></div>
    <a href="#/app/studies/{{study.nodeRef}}">
       <h4 class="feed-title">{{study.title}}</h4>
    </a>
  </div>
</div>

以下是我的 controller.js

的摘录
Studies.all().then(function(payload){
   $scope.studies = payload;
});

Studies.all().then(function(studies){
   $scope.study = $filter('filter')(studies, function (d) {return d.nodeRef === '"'+ $stateParams.studynodeRef + '"';})[0];
});

因此Studies.all()调用了研究服务,该服务对json文件进行异步调用以获取数据。

Studies.all().then(function(payload){
  $scope.studies = payload;
});

这将获得在students.html文件中迭代的所有研究的列表。每项研究都有其独特的nodeRef。当您点击某项研究时,它会映射到网址"#/app/studies/{{study.nodeRef}}"。之后,我想使用nodeRef从研究集合中筛选出一个应该由

完成的研究对象。
Studies.all().then(function(studies){
$scope.study = $filter('filter')(studies, function (d) {return d.nodeRef === '"'+ $stateParams.studynodeRef + '"';})[0];
});

其中d.nodeRef === '"'+ $stateParams.studynodeRef + '"'将其与正确的nodeRef匹配并筛选出该研究。但是,当我尝试在{{study}}这样的模板中打印研究时,没有任何内容出现,当我执行console.log()时,它未定义。

我该如何解决这个问题?如果需要任何澄清,请告诉我。

修改

我对我的控制器进行了一些更改。我现在能够从url访问nodeRef,但由于某些原因它在我的过滤器函数中不起作用,除非我手动输入它。在这里查看https://gist.github.com/shubhamsinha92/01b492c62c4dd5ad3a7c

这就是我的services.js的样子:

var app = angular.module('starter.services', [])


.factory('Studies',function($http,$filter,$q){
    var deferred = $q.defer();
    var studies = [];
    $http.get("studies.json").success(
            function(data){
                //studies = data;
                angular.copy(data, studies);
                //At this point you can filter data as required, or not at all. I would suggest returning the entire JSON response and not filtering here at all, let the controllers filter the data as needed to maintain a layer of separation between controller and service.

                deferred.resolve(studies);
            }
        );

  return {
    all: function(){
      return deferred.promise;
    }
};
})

1 个答案:

答案 0 :(得分:0)

似乎您正在比较&#34;&#34; nodeId&#34;&#39; to&#39; nodeId&#39;。

原始

$filter('filter')(payload, function (d) {
    $scope.id = '"' + $rootScope.nodeId + '"';
    return d.nodeRef === $scope.id ;})[0]; 

解决方案

$filter('filter')(payload, function (d) {
  $scope.id = "" + $rootScope.nodeId;
  if (d.nodeRef === $scope.id)
    return d;})[0]; 

请参阅此示例

https://jsfiddle.net/HB7LU/15157/