2017-07-25 38 views
0

私の質問がより具体的に変更されました。今私は希望の動作に気にせず、構文エラーを修正する必要がありますエラー "プロパティが存在しません"

私はこのコードでエラーが発生しました。

深刻度: 'エラー'

メッセージ: ' 'PagerserviceProvider 'タイプには存在しない' オフセット' プロパティ'

実際に私はこの3つの変数について同じエラーがあります。

の開始時に「本」の元の値を格納するために使用される変数の名前だけである「ことを」that.pageSize、that.offset、that.size

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(that.offset <= that.size - that.pageSize) 
      { 
       that.offset += that.pageSize; 
      } 
      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); 
       }); 
      });      
     }    
    };} 
+1

正確には何が問題なのですか? –

+1

[var = this;とは何か? JavaScriptの意味ですか?](https://stackoverflow.com/questions/4886632/what-does-var-that-this-mean-in-javascript) –

+0

@Jeremy Thille私の変数には、私が推測していることを認識できないというエラーがあります。その理由は正しいコンテキストを選択していることです – david

答えて

1

キーワードfunctionを使用して関数を宣言すると、この関数は上の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() 
    } 
} 

この制限を回避するには、あなたのコードは、上のスコープにあるとき、あなたは変数に自分の上位thisを保存することができます。この変数は通常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() 
    } 
} 

EDIT:

thatの使用を避けるために別のトリックがES6矢印機能を使用することです。矢印機能の中では、thisは常に上部スコープを指します。

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() 
    } 
} 

EDIT 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); 
       }); 
      });      
     }    
     }; 
    } 
+0

なぜ私のコードにエラーがあるのか​​知っていたのですが、 said – david

+0

あなたは明示的に 'that.offset = ...、that.pageSize = ...'を宣言していますか? 'let'はデフォルトで' that'にそれを追加しません –

+0

私は "var"を使用しましたが、まだエラーがあります – david

0

あなたのコードは、 'this'の値が変わると変わります。変数名は 'dog'または 'apple'と同じように簡単にできます。

その時点で 'this'の現在の値にアクセスする予定がある場合は、代わりにコード内で 'this'を使用することを選択できます。それ以外の場合は、値を格納していた元の変数を参照することになります。 'それ'、 '犬'または 'リンゴ'。

+0

私が理解できないことは、私が定義した文脈と同じ文脈で変数を定義すること "それ"だから "that.offset"は無意味ではない – david

0

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 

ソリューションはsomeInstancegetPagerをバインドすることです。この方法では、常にコンテキストthissomeInstanceを指しています。

someHTMLButton.onClick = someInstance.getPager.bind(someInstance) 
関連する問題