2016-06-14 43 views
3

的ngRepeat过滤结果引用我使用的是NG重复指令与过滤器,像这样:AngularJS - 如何让内部控制器

<tr ng-repeat="entry in (filteredEntries = (entries | filter:hasGroup | filter:readingFilter | orderBy:data.sortType:data.sortReverse:true))"></tr> 
    <span>{{filteredEntries.length}}</span> 

我使用$ stateProvider加载视图和控制器

  $stateProvider 
      .state('welcome', { 
       url: "/", 
       templateUrl: viewsPrefix + "welcome.html", 
       data: { 
        pageTitle: 'Welcome' 
       }, 
       controller: "WelcomeCtrl" 
      }) 
      .state('data', { 
       url: "/data", 
       templateUrl: viewsPrefix + "data.html", 
       data: { 
        pageTitle: 'Data' 
       }, 
       controller: "DataCtrl", 
      }) 

这里是我的控制器的一个片段:

.controller('DataCtrl', ['$scope', '$rootScope', '$state', '$translate', '$filter') { 
$scope.filteredEntries = []; 
$scope.entries = [1, 2, 3, 4, 5, 6,7]; 
$scope.hasGroup = function(){return true;} 
$scope.readingFilter = function(){return true;} 
setInterval(function() { 
    console.log($scope.filteredEntries); 
}, 500); 
}); 

这样的代码没有问题,但是我需要使用$scope.filteredEntries访问我的控制器中的filteredEntries属性,这应该没问题。不幸的是,这不起作用,我无法弄清楚为什么会发生这种情况。

+0

目前很难回答你的问题。你在问为什么你不能访问控制器内的'filteredEntities'。然而,过滤是一个有序的过程,并且不知道你的控制器代码是什么样子,但在访问数据时你所处理的过程中的哪一步并不明显。数据在您尝试访问该值时尚未过滤完全有可能。 – Claies

+1

评论而不是回答,因为这不是答案。您应该考虑使用ng-change/watch过滤控制器中的数据,以便在需要时重新过滤数据。在angular2中,filter和orderBy过滤器会消失,因为在视图中做这种事情最终会看起来很丑陋,而且会导致效率下降。有关这些决定,请参阅https://angular.io/docs/ts/latest/cookbook/a1-a2-quick-reference.html#!#filters-pipes。 – stygma

+0

检查https://jsfiddle.net/mohamedsalah/z54rkg17/2/ –

回答

1

您可以使用此方法访问两个视图和控制器的过滤数组:

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

 
app.controller('MainCtrl', function() { 
 
    var vm = this; 
 
    vm.people = ['fox', 'rosi', 'err3', 'rob', 'cesar', 'geoff']; 
 
    
 
    vm.logPeople = function() { 
 
    console.log("FILTERED PEOPLE: ", vm.filteredPeople); 
 
    } 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.21/angular.min.js"></script> 
 
<div ng-app="test"> 
 
    <div ng-controller="MainCtrl as vm"> 
 
    <h2>List of people</h2> 
 
    Search: <input type="text" ng-model="search"> 
 
    <ul> 
 
     <li ng-repeat="person in vm.filteredPeople = (vm.people | filter:search)"> 
 
     {{person}} 
 
     </li> 
 
    </ul> 
 
    <p ng-hide="vm.filteredPeople.length">There is no result</p> 
 
    
 
    <button ng-click="vm.logPeople()">LOG PEOPLE</button> 
 
    <br><br> 
 
    Number of filtered people: {{vm.filteredPeople.length}} 
 
    </div> 
 
</div>

更新与更新代码的例子。

因此,在数据路径的状态提供,加上 “controllerAs: '虚拟机',”:

.state('data', { 
     url: "/data", 
     templateUrl: viewsPrefix + "data.html", 
     data: { 
      pageTitle: 'Data' 
     }, 
     controllerAs: 'vm', 
     controller: "DataCtrl", 
    }) 

然后,在你的控制器:

.controller('DataCtrl', ['$scope', '$rootScope', '$state', '$translate', '$filter') { 
var vm = this; 

vm.filteredEntries = []; 
vm.entries = [1, 2, 3, 4, 5, 6,7]; 
vm.hasGroup = function(){return true;} 
vm.readingFilter = function(){return true;} 

vm.logEntries = function() { 
    console.log("FILTERED Entries: ", vm.filteredEntries); 
} 

}); 

最后,在你的模板(添加的按钮来测试记录的条目):

{{filteredEntries.length}}

<button ng-click="vm.logEntries()">LOG Entries</button> 
<br><br> 
+0

不幸的是,它出于某种原因在我的代码中不起作用。我更新了我的问题,为您提供更全局的图像 –

+0

您是否也可以发布相关的控制器代码? –

+0

我更新了问题 –