【问题标题】:Why don't AngularJS Filters work when inside an ng-if?为什么AngularJS过滤器在ng-if中不起作用?
【发布时间】:2015-11-04 19:56:44
【问题描述】:

我有一个简单的 AngularJS 页面,其中包含在单击链接时显示和隐藏的不同部分。其中一个区域有一个可以过滤的重复列表。

当包含列表的部分以ng-showng-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/ngIfnsShowngHide 基本上只是切换/动画分类。

标签: angularjs angular-filters


【解决方案1】:

我自己没有原型继承这一主题的硕士学位,但我会尽快解释一下(关于这个主题有大量资源);

  • Number
  • String
  • Boolean
  • null
  • undefined
  • Symbol(从 ES6 开始)

被视为primitives (MDN)

现在 - 当您从父作用域“继承”原语时,实际发生的是子作用域“镜像”或“遮蔽”给定的原语值。因此,您可以将其视为上述内容的副本。

大致是原型继承上下文中原语的本质。

这可以在modified version of your broken fiddle 中清楚地观察到。

尝试使用这两个输入,当您只触摸外部输入(即子值“遮蔽”父值)时,您会看到两个值之间存在联系。但是,一旦您触摸内部输入,这些值就会相互断开。


推荐解决这个问题的方法是使用 reference 到模型上的属性(我说的是模型,但实际上它只是一个 JS 对象),即进一步定义原型链;

$parentScope.obj = { filterText: '' };

ng-model="obj.filterText"

现在您应该可以使用 ngIfngSwitchngRepeat 来列举一些创建新范围的 Angular 提供的指令。

有关该主题的资源

【讨论】:

    猜你喜欢
    • 2017-10-09
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多