필터와 함께 ng-repeat 지시문을 사용하고 있습니다.
ng-repeat="item in items | orderBy:'order_prop' | filter:query | limitTo:4"
렌더링 된 결과를 잘 볼 수 있습니다. 이제 컨트롤러에서 그 결과에 대한 논리를 실행하고 싶습니다. 문제는 결과 항목 참조를 어떻게 얻을 수 있습니까?
최신 정보:
명확히하기 위해 : 자동 완성을 만들려고 하는데이 입력이 있습니다.
<input id="queryInput" ng-model="query" type="text" size="30" placeholder="Enter query">
그런 다음 필터링 된 결과 :
<ul>
<li ng-repeat="item in items | orderBy:'order_prop' | filter:query | limitTo:4">{{item.name}}</li>
</ul>
이제 결과를 탐색하고 항목 중 하나를 선택하고 싶습니다.
답변
업데이트 : 여기에 이전보다 쉬운 방법이 있습니다.
<input ng-model="query">
<div ng-repeat="item in (filteredItems = (items | orderBy:'order_prop' | filter:query | limitTo:4))">
{{item}}
</div>
그런 다음 $scope.filteredItems
액세스 할 수 있습니다.
답변
Andy Joslin 솔루션의 필터 버전은 다음과 같습니다.
업데이트 : BREAKING CHANGE. 버전 1.3.0-beta.19 ( 이 commit ) 필터에는 컨텍스트 this
가 없으며 전역 범위에 바인딩됩니다. 컨텍스트를 인수로 전달하거나 ngRepeat , 1.3.0-beta.17 + 의 새로운 앨리어싱 구문을 사용할 수 있습니다 .
// pre 1.3.0-beta.19
yourModule.filter("as", function($parse) {
return function(value, path) {
return $parse(path).assign(this, value);
};
});
// 1.3.0-beta.19+
yourModule.filter("as", function($parse) {
return function(value, context, path) {
return $parse(path).assign(context, value);
};
});
그럼 당신의 관점에서
<!-- pre 1.3.0-beta.19 -->
<input ng-model="query">
<div ng-repeat="item in items | orderBy:'order_prop' | filter:query | limitTo:4 | as:'filteredItems'">
{{item}}
</div>
<!-- 1.3.0-beta.19+ -->
<input ng-model="query">
<div ng-repeat="item in items | orderBy:'order_prop' | filter:query | limitTo:4 | as:this:'filteredItems'">
{{item}}
</div>
<!-- 1.3.0-beta.17+ ngRepeat aliasing -->
<input ng-model="query">
<div ng-repeat="item in items | orderBy:'order_prop' | filter:query | limitTo:4 as filteredItems">
{{item}}
</div>
에 액세스 할 수 $scope.filteredItems
있습니다.
답변
ng-repeat의 문제점은 액세스 할 수 없기 때문에 자식 범위를 생성한다는 것입니다.
필터
컨트롤러에서
<li ng-repeat="doc in $parent.filteritems = (docs | filter:searchitems)" ></li>
답변
최신 정보:
1.3.0 이후에도. 당신이 컨트롤러 또는 부모의 범위에 넣어하려는 경우 당신이 함께 할 수 없어 같은 구문. 예를 들어 다음 코드가있는 경우 :
<div>{{labelResults}}</div>
<li ng-repeat="label in (labels | filter:query | as labelResults)">
</div>
위의 작동 하지 않습니다 . 그것을 해결하는 방법은 $ parent를 다음 과 같이 사용하는 것입니다 .
<li ng-repeat="label in ($parent.labelResults = (labels | filter:query))">
답변
앤디 솔루션의 다소 나은 버전을 생각해 냈습니다. 그의 솔루션에서 ng-repeat는 과제가 포함 된 표현식을 감시합니다. 각 다이제스트 루프는 해당 표현식을 평가하고 결과를 범위 변수에 할당합니다.
이 솔루션의 문제점은 하위 범위에있는 경우 할당 문제가 발생할 수 있다는 것입니다. 이것은 ng-model에 점이 있어야하는 이유와 같습니다 .
이 솔루션에 대해 내가 싫어하는 다른 점은 뷰 마크 업 어딘가에 필터링 된 배열의 정의를 묻는다는 것입니다. 뷰 또는 컨트롤러의 여러 위치에서 사용하는 경우 혼동 될 수 있습니다.
더 간단한 해결책은 컨트롤러에 시계를 배치하는 기능에 배치하는 것입니다.
$scope.$watch(function () {
$scope.filteredItems = $scope.$eval("items | orderBy:'order_prop' | filter:query | limitTo:4");
});
이 기능은 각 다이제스트주기 동안 평가되므로 성능은 Andy의 솔루션과 비슷해야합니다. 또한 함수에 여러 개의 할당을 추가하여 뷰에 대해 흩어져 있지 않고 한 곳에 보관할 수 있습니다.
보기에서 필터링 된 목록을 직접 사용하면됩니다.
<ul>
<li ng-repeat="item in filteredItems">{{item.name}}</li>
</ul>