Angularjs ui引导选项卡的作用域问题

Angularjs ui引导选项卡的作用域问题,angularjs,angular-ui-bootstrap,Angularjs,Angular Ui Bootstrap,我在理解范围方面有问题。ui引导在使用tabset时创建了一个新的作用域,我明白了。我以为父方法可用于子作用域?这是一个jsbin,显示了我的问题 我肯定我遗漏了一些简单的东西,但我看不到 如果JSBin出现问题,代码内联: angular.module('app', ['ui.bootstrap']) .controller('MainController', function($scope) { $scope.filters = []; $scope.search = '';

我在理解范围方面有问题。ui引导在使用tabset时创建了一个新的作用域,我明白了。我以为父方法可用于子作用域?这是一个jsbin,显示了我的问题

我肯定我遗漏了一些简单的东西,但我看不到

如果JSBin出现问题,代码内联:

angular.module('app', ['ui.bootstrap'])
.controller('MainController', function($scope) {
  $scope.filters = [];
  $scope.search = '';
  $scope.providerVersions = [
    { name:'SomeOS', type:'pv' },
    { name:'OtherOS', type:'pv' }
  ];
  $scope.scripts = [
    { name:'Something', pv:'SomeOS', type:'script' },
    { name:'Somebody', pv:'SomeOS', type:'script' },
    { name:'Other thing', pv:'OtherOS', type:'script' },
    { name:'Other body', pv:'OtherOS', type:'script' }
  ];

  $scope.addFilter = function(f) {
    $scope.filters.push({ name:f.name, type:f.type });
  };

  $scope.remFilter = function(i) {
    $scope.filters.splice(i,1);
  };

  $scope.filterByName = function(n) {
      var name = n.name.toLowerCase();
      var search = $scope.search.toLowerCase();
      return name.indexOf(search) > -1;
  };

  $scope.filterByFilters = function(f) {
    if ($scope.filters.length===0) { return true; }

    var byName = _.where($scope.filters, { type:'script' });
    if (byName.length > 0) {
      return _.contains(_.pluck(byName, 'name'), f.name);
    }
    return _.contains(_.pluck($scope.filters, 'name'), f.pv);
  };
});
HTML


这很有效
按预期筛选名称和角色

{{s.name}} {{f.name}},
  • 名称
  • {{s.name}
  • 角色
  • {{p.name}
这行不通 仅对角色进行筛选。它不调用$scope.filterByName

{{s.name}} {{f.name}},
  • 名称
  • {{s.name}
  • 角色
  • {{p.name}

作用域既有趣又令人困惑。除了$rootScape之外,所有作用域都有祖先。我不确定,但我假设ui引导选项卡集创建了自己的隔离范围。该隔离作用域确实有一个父级,但您已经“隔离”了它,因此它无法看到祖先作用域的任何属性,除非您在指令中明确地包含它们。如果隔离作用域的子作用域不是隔离作用域,则它可以查看和操作其父属性,但不能再回到祖先链。事件可以在链上自由地上下传递,使用它们时应该非常小心,因为在处理隔离作用域时,可能会产生意想不到的副作用

如果以上只是一堆胡说八道的话,那就去那里重新阅读这些信息——也许这会让事情变得更清楚


这可能是关于范围的最好的论文之一,你可以快速、简洁、清晰地解释一下-

我能够解决这个问题。老实说,我不知道为什么会这样,但确实如此。也许其他人可以帮我填补空白。我所做的不是尝试过滤我的列表,而是更改了filter函数以返回一个数组,并将该结果用于ng repeat进行迭代

旧过滤函数

$scope.filterByName = function(n) {
  var name = n.name.toLowerCase();
  var search = $scope.search.toLowerCase();
  return name.indexOf(search) > -1;
};
$scope.filterByName = function(list, srch) {
        var ret = [];

        _.each(list, function(l) {
            if (l.name.toLowerCase().indexOf(srch.toLowerCase()) > -1) {
                ret.push(l);
            }
        });

        return ret;
    };
新的过滤函数

$scope.filterByName = function(n) {
  var name = n.name.toLowerCase();
  var search = $scope.search.toLowerCase();
  return name.indexOf(search) > -1;
};
$scope.filterByName = function(list, srch) {
        var ret = [];

        _.each(list, function(l) {
            if (l.name.toLowerCase().indexOf(srch.toLowerCase()) > -1) {
                ret.push(l);
            }
        });

        return ret;
    };
老ng重复

<li ng-repeat="s in scripts|filter:filterByName">
<li ng-repeat="s in filterByName(scripts, search)">
  • 新ng重复

    <li ng-repeat="s in scripts|filter:filterByName">
    
    <li ng-repeat="s in filterByName(scripts, search)">
    

  • 选项卡可能被实现为具有独立作用域的指令,不会与其他作用域形成父/子关系。除此之外,您似乎共享了很多代码,但我不确定问题出在哪里。您是对的。选项卡是一个指令。我需要在这些下拉列表中调用父作用域上的函数。我相信这个范围是被排除在外的。为什么要使用下划线的foreach,它只是javascript foreach的一个synomym?你在写一个angular应用程序,并且是在angular上下文中,你不应该使用angular.foreach吗?嘿,mortashi,说实话?习惯。我对下划线很熟悉,所以我到处都用。对于这个项目,我不需要支持IE8,所以我可以使用javascript的每一个,但在这个特定应用的实际使用中,我没有注意到性能上的差异。谢谢你的邀请,我不应该因为这样的习惯而偷懒。