【发布时间】:2015-11-04 19:56:44
【问题描述】:
我有一个简单的 AngularJS 页面,其中包含在单击链接时显示和隐藏的不同部分。其中一个区域有一个可以过滤的重复列表。
当包含列表的部分以ng-show 或ng-hide 显示/隐藏时,它会正常运行。使用ng-if时,无法过滤列表。
演示
示例 HTML
<nav>
<a href="javascript:{}" ng-click="area='one';">Area 1</a>
<a href="javascript:{}" ng-click="area='two';">Area 2</a>
</nav>
<div ng-if="area==='one'">
<h3>Area 1!</h3>
<input type="text" placeholder="filter list..." ng-model="filterText" />
<ul>
<li ng-repeat="item in list | filter: listFilter">
{{item.id}} - {{item.name}}
</li>
</ul>
</div>
<div ng-if="area==='two'">
<h3>Area 2!</h3>
<p>Stuff here...</p>
</div>
角度示例
$scope.area="one";
$scope.filterText="";
$scope.list = [
{id:1, name:"banana"},
{id:2, name:"apple"},
{id:3, name:"orange"},
{id:4, name:"pear"},
{id:5, name:"apricot"}
];
$scope.listFilter = function(item){
var term = $scope.filterText.trim().toLowerCase();
return item.id.toString().indexOf(term) > -1 || item.name.indexOf(term) > -1;
};
【问题讨论】:
-
不是过滤器,而是输入(好吧,无论如何,输入的
ngModel)。因此重复:stackoverflow.com/a/18342974/624590。 (为了向自己证明这一点,您可以将输入移到ngIf之外,您的示例将按预期工作)。您的工作修改将使用ng-model="$parent.filterText", jsfiddle.net/Lmbfdxvs/10 -
所以在
ng-if内嵌套HTML 会创建一个新范围,但在ng-show内嵌套不会? -
是的。
ngIf包含内容,每次创建时都会创建一个新范围(例如,如果它变为 false,则范围被销毁;当它再次变为 true 时,将创建一个新范围)。 docs.angularjs.org/api/ng/directive/ngIf 。nsShow和ngHide基本上只是切换/动画分类。