2016-06-14 57 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

我更新了問題 –