Angularjs ui引导选项卡的作用域问题
我在理解范围方面有问题。ui引导在使用tabset时创建了一个新的作用域,我明白了。我以为父方法可用于子作用域?这是一个jsbin,显示了我的问题 我肯定我遗漏了一些简单的东西,但我看不到 如果JSBin出现问题,代码内联: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 = '';
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的每一个,但在这个特定应用的实际使用中,我没有注意到性能上的差异。谢谢你的邀请,我不应该因为这样的习惯而偷懒。