angularjs - AngularJS 1.7 中用于过滤的函数没有“this”上下文
问题描述
我正在将一些控制器换成组件。我有一个具有自定义过滤器功能的控制器:
function MyController($scope, $filter) {
$scope.customFilter = function(item) {
$filter('filter')([item], $scope.search);
}
}
在我的模板中:
<input type="text" ng-model="search">
<div ng-repeat="item in (filtered = (items | filter:customFilter))" >
当我可以访问 $scope 时,这非常有用。我的过滤器功能要复杂得多,但是是一次性的。我真的不需要将它定义为应用程序的真正过滤器,因为它没有在其他任何地方使用。因此,控制器本身只是一个自定义函数。
但是,我将控制器移至组件,并且无权访问 $scope。
class MyComponent {
constructor($filter) {
this.$filter = $filter;
this.search = '';
}
customFilter(item) {
this.$filter('filter')([item], this.search);
}
onCustomClick() {
// if this is called from ng-click
// I can access 'this' here, why not in filter
}
}
模板:
<input type="text" ng-model="$ctrl.search">
<div ng-repeat="item in ($ctrl.filtered = (items | filter:$ctrl.customFilter))">
customFilter 函数像以前一样被调用,但是它没有上下文绑定。“this”变量未定义。我做错了什么,或者我应该能够在过滤器功能中访问我的组件的上下文吗?
如果我在 ng-click 中调用函数,“this”上下文绑定正确,这是调用组件函数进行过滤的限制吗?
解决方案
我不确定,但我认为当过滤器调用你的函数时,它会创建自己的上下文,因此你有一个未定义的 this。
一个快速和替代的解决方案可以是这个示例,您还可以将参数传递给您定义的过滤函数,它将返回一个匿名函数
class MyComponent {
constructor() {
this.search = '';
}
customFilter(searchText) {
return function (item) {
$filter('filter')([item], searchText);
}
}
onCustomClick() {
// if this is called from ng-click
// I can access 'this' here, why not in filter
}
}
模板:
<input type="text" ng-model="$ctrl.search">
<div ng-repeat="item in ($ctrl.filtered = (items | filter:$ctrl.customFilter($ctrl.search)))">
推荐阅读
- tomcat - Tomcat 问题:我尝试部署 WAR 文件,但收到此消息:源服务器未找到目标资源的当前表示
- python - Python在读取JSON文件时抛出错误
- swift - 从其他视图控制器执行功能
- c# - 如何使用数据网格视图列值按升序排序?
- javascript - 如何在 JS 中映射对象数组并为每个对象获取网络数据?
- r - 如何使用 r 中的 if-else 循环替换时间序列数据的缺失值
- python - 如何从使用 plot_date 生成的图形中删除点?
- c++ - 使用 OpenSSL 作为静态库在 Visual Studio 中编译项目
- apache - Apache 为每个 WebSocket 连接保留一个活动工作器
- svn - 如何使用最后 2 个版本的 SVN 存储库打印所有文件的属性?