![](/img/trans.png)
[英]How to use angular variables into laravel functions in a blade template?
[英]Angular 6+ How to use inner functions with class variables?
我想在处理 5 个不同的用户输入数组时使用 array.filter(my_func()) 优雅地返回没有用户刚刚删除的元素的数组,并带有一个私有的 filterInput 类变量。 但是, my_func() 在用作内部调用时没有“this”上下文。
有一个更好的方法吗? 宁愿不在 5 个不同的调用者中编写相同的过滤器函数,只是为了保持范围。
MyClass
private inputArray1: string[];
...
private filterInput: string;
...
private filterFunc(element, index, array) {
return (element !== this.filterInput);
}
...
public caller1(input: string) {//this is called from the onclick() in the HTML
this.filterInput = input;
this.inputArray1 = this.inputArray1.filter(this.filterFunc());
}
任何人都知道如何在不废弃过滤器实用程序的情况下完成此操作,只需使用搜索编写我自己的然后返回 slice1 + slice2?
您可以使用函数绑定方法来修复this
引用
public caller1(input: string) {
this.filterInput = input;
this.inputArray1 = this.inputArray1.filter(this.filterFunc.bind(this));
}
或者你可以使用javascript箭头函数
public caller1(input: string) {
this.filterInput = input;
this.inputArray1 = this.inputArray1.filter((elm,idx,arr) => this.filterFunc(elm,idx,arr));
}
另一种方式是 javascript 函数闭包🧙♂️
private filterFunc() {
const filterInput = this.filterInput;
return function (element, index, array) {
return (element !== filterInput);
}
public caller1(input: string) {
this.inputArray1 = this.inputArray1.filter(this.filterFunc());
}
但我更喜欢使用这样的参数来设置过滤器值
private filterFunc(filterInput) {
return function (element, index, array) {
return (element !== filterInput);
}
public caller1(input: string) {
this.inputArray1 = this.inputArray1.filter(this.filterFunc(this.filterInput));
}
有关如何解决此问题的一般解决方案,请参阅如何在回调中访问正确的“ this ”? ,但对于filter
方法,只需将上下文作为第二个参数传递:
this.inputArray1 = this.inputArray1.filter(this.filterFunc, this);
// ^^^^
虽然这是相对单调的。 您根本不会使filterFunc
成为实例方法,您只需在caller1
方法中定义一个本地函数并使其成为input
参数的闭包:
public caller1(input: string) {
function filterFunc(element, index, array) {
return (element !== input);
// ^^^^^
}
this.inputArray1 = this.inputArray1.filter(filterFunc);
// ^^^^^^^^^^
}
或者做同样的事情,但通过将函数内联定义为表达式、使用箭头语法并省略不需要的参数来更简洁:
public caller1(input: string) {
this.inputArray1 = this.inputArray1.filter(element => element !== input);
}
另一种可能的方法是像这样编写“filterFunc”(ts 编译器不会将它放在原型上):
private filterFunc = (element, index, array) => {
return (element !== this.filterInput);
}
并像这样使用它:
this.inputArray1 = this.inputArray1.filter(this.filterFunc);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.