Javascript 获取错误“;“财产不存在”;

Javascript 获取错误“;“财产不存在”;,javascript,cordova,ionic2,Javascript,Cordova,Ionic2,我修改了我的问题,使之更加具体。现在我不关心期望的行为,我只需要纠正语法错误 我正在研究这个代码中的一个错误 严重性:“错误” 消息:“PagerserviceProvider”类型上不存在属性“offset” 事实上,对于这三个变量,我有相同的错误 那个。页面大小,那个。偏移量,那个。大小 public异步getPager(tableName:string,pageSize:number=10){ 让pageSize=pageSize; 设偏移量=0; let limit=页面大小; 让siz

我修改了我的问题,使之更加具体。现在我不关心期望的行为,我只需要纠正语法错误

我正在研究这个代码中的一个错误

严重性:“错误”

消息:“PagerserviceProvider”类型上不存在属性“offset”

事实上,对于这三个变量,我有相同的错误

那个。页面大小,那个。偏移量,那个。大小

public异步getPager(tableName:string,pageSize:number=10){
让pageSize=pageSize;
设偏移量=0;
let limit=页面大小;
让size=wait this.getTotal(tableName);
让那=这;
返回{
initialPage:函数(){
返回新承诺((解决、拒绝)=>{
var d=[];
executeSql(表名、限制、偏移量)。然后((数据)=>{
log(JSON.stringify(data));
对于(var i=0;i{
拒绝(e);
});
});
},
下一页:函数(){
如果(那)是偏移量{
var d=[];
executeSql(表名、限制、偏移量)。然后((数据)=>{
对于(var i=0;i{
拒绝(e);
});
});                    
}            
};}

“that”只是一个变量的名称,当“this”的值更改时,该变量用于在代码开头存储“this”的原始值。变量名也可以是“dog”或“apple”


如果您打算在该时间点访问“this”的当前值,您可以选择稍后在代码中使用“this”。否则,您可能会引用存储其值的原始变量,例如“that”、“dog”或“apple”。

当您使用关键字
function
声明函数时,函数的this不引用上方的
this
。因此,在函数体中使用
this
,是指函数本身

您面临的问题与这样一个事实有关:您的函数是在已定义了
this
的类中声明的,因此您需要一种在嵌套函数中引用上层
this
的方法

class Test {

  hello () { console.log('hello') }

  method () {
    this.hello() // It will work because `this` refers to the class
    function sayHello () {
      return this.hello()
      // it won't work because `this` refers to the function sayHello
    }
    return sayHello()
  }
}
要绕过此限制,您可以在代码处于上限范围时将上限
保存在变量中。此变量通常称为
that
self

class Test {

  hello () { console.log('hello') }

  method () {
    var that = this // that is now refering to the class
    this.hello() // It will work because `this` refers to the class
    function sayHello () {
      return that.hello()
      // that is still refering to the class so it will succeed
    }
    return sayHello()
  }
}
编辑:

另一个避免使用
的技巧是使用ES6箭头函数。在箭头函数中,
这个
总是指上范围

class Test {

  hello () { console.log('hello') }

  method () {
    this.hello() // It will work because `this` refers to the class
    // `this` refers to the upper scope by default so it works
    const sayHello = () => this.hello()
    return sayHello()
  }
}
编辑2:

您的代码应该是:

  public async getPager(tableName: string, pageSize: number = 10) {
    let pageSize = pageSize;
    let offset = 0;
    let limit = pageSize;
    let size = await this.getTotal(tableName);
    let that = this;
    return  {
        initialPage: function () {

            return new Promise((resolve,reject)=>{
                var d = [];
                that.executeSql(tableName, limit, offset).then(data => {
                    console.log(JSON.stringify(data));
                    for(var i = 0 ; i < data.rows.length ; i++) {
                        d.push(data.rows.item(i));
                    }
                    resolve(d);
                }, e => {
                    reject(e);
                });
            });

        },
        nextPage: function () {
            if(offset <= size - pageSize ) {  
                offset += pageSize;
                // no need to use `that` because you used `let`
            }
            return new Promise((resolve, reject) => {
                var d = [];
                that.executeSql(tableName, limit, offset).then(data => {
                    for(var i = 0 ; i < data.rows.length ; i++) {
                        d.push(data.rows.item(i));
                    }
                    resolve(d);
                }, e => {
                    reject(e);
                });
            });                    
        }            
      };
    }
public异步getPager(tableName:string,pageSize:number=10){
让pageSize=pageSize;
设偏移量=0;
let limit=页面大小;
让size=wait this.getTotal(tableName);
让那=这;
返回{
initialPage:函数(){
返回新承诺((解决、拒绝)=>{
var d=[];
executeSql(表名、限制、偏移量)。然后(数据=>{
log(JSON.stringify(data));
对于(var i=0;i{
拒绝(e);
});
});
},
下一页:函数(){
如果(偏移量){
var d=[];
executeSql(表名、限制、偏移量)。然后(数据=>{
对于(var i=0;i{
拒绝(e);
});
});                    
}            
};
}

getPager
是一种方法:如果您使用已丢失的上下文调用它,
that
将获取当前的
this
值,该值未指向正确的上下文

const someInstance = new SomeClass()

someInstance.getPager() // You call getPager directly from the someInstance context

someHTMLButton.onClick = someInstance.getPager // Here the getPager method lost its context
解决方案是将
getPager
绑定到
someInstance
。这样,它的上下文总是指向某个实例

someHTMLButton.onClick = someInstance.getPager.bind(someInstance)

问题到底是什么?请阅读以下内容:。它能很好地理解你的问题,希望对你有所帮助!可能重复@Jeremy Thille我的变量有一个错误我不知道我猜原因是选择了正确的上下文事实上我能做什么来纠正错误我不理解的是,我在相同的上下文中定义变量,我定义的上下文“that”so“that.offset”毫无意义我知道所有,但为什么我的代码有错误,我使用了与您所说的相同的规则我已经用您的代码编辑了我的答案告诉我它是否工作正常,因此当您在上部范围(getPaper范围)中使用
let
时,您可以引用变量,而无需
this
that
,因为它们可用于所有嵌套函数。如果您想用其他方法访问这些变量,您可以使用
let
use
this
let offset=0
变为
this.offset=0
酷!如果解决了您的问题,请接受答案;)
someHTMLButton.onClick = someInstance.getPager.bind(someInstance)