2017-09-01 12 views
0

オブジェクトを観察していて、値を変更したときに関数を呼び出す必要があります。プロキシオブジェクト(Javascript ECMAscript)で外部関数を呼び出す

私はObject.observeでそれを行うことができ、Proxyで簡素化しようとします。

私は外部関数を呼び出すことができません、それは未定義と言う原因になります。 外部関数をトラップする方法は?

機能doStmgを(答えるためにフォローアップとして編集

const page = {} 
const pageHandler = { 
    externalFunction : externalFunction, // does not work: gets undefined 
    doSmtg : function(value) { 
     // do something on a value 
     externalFunction(value) // externalFunction is undefined 
     this.externalFunction(value) // same problem 
    }, 
    set(target, key, value) { 

    if (key == 'article') { 

     this.doSmtg(value); 

     } 
    } 
} 

const proxyPage = new Proxy(page , pageHandler); 


function externalFunction(myObject) { 

    // do things on my Object 
    // this function can be called somewhere else then proxy Page 

} 

)と呼ばれ、まだexternalFunctionを除き、それに//Stuffを実行している:ここ

は私のものです未定義。 externalFunctionは他の場所では通常呼び出されます。 OPの特定の例として

const page = { 
    // observePage : observePage 
} 

const pageHandler = { 
    // observePage : observePage, 
    set : setPageProperty, 

    get(target, key) { 
    console.log('Getting page', target[key]); 
    return target[key] 
    } 
}; 

const proxyPage = new Proxy(page , pageHandler); 


function setPageProperty(target, key, value) { 
    target[key] = value; 
    if (key == 'article') { 
      doSmtg(value); 
    } 
} 


function doSmtg(article) { 

     // stuff 

     $("a[href*='/url/']").click(function(e){ 

      param = { 
       titles : l 
      }; 

      externalFunction(param, pageCallback, setOpenFromGraph(false)); 

     }); 

    } 


function externalFunction(param, firstCallback, secondCallback) { 
    // stuff 
} 
+0

プロキシは、 'ハンドラ' と 'ターゲット' は異なっていました。プロキシのターゲットは 'page'で、ハンドラ 'pageHandler'はターゲットにexternalFunctionが含まれていないため、未定義です。あなたは外部関数をページにプロパティ –

+0

として移動する必要があります。どちらのシナリオでも私のために働きます – MinusFour

+0

ありがとう皆さんありがとうございます。 @ftor @Shyam Babuあなたは例を教えていただけますか?私はconst 'page = {externalFunction:externalFunction}'を試してから 'doSmtg()'の 'page.externalFunction'または' target.externalFunction'として呼び出しましたが動作しませんでした。 – user305883

答えて

0

...のみ指定されたトラップをターゲットとすべきページハンドラのオプションの設定は変更する必要がありますが、1にも例の1以上から持っていることを認識すべきであるだけでなく、 setトラップを実行するためにproxyPageオブジェクトで作業します。それ以外の場合はpageプロパティに直接値を代入することは検出されません。

function externallyHandlePageArticleChange(value) { 
 
    console.log("externallyHandlePageArticleChange :: value :", value); 
 
} 
 

 

 
function handlePagePropertyChange(target, key, value/*, receiver*/) { 
 
    console.log("handlePagePropertyChange :: [target, key, value] :", target, key, value); 
 

 
    target[key] = value; 
 

 
    if (key === 'article') { 
 

 
    externallyHandlePageArticleChange(value); 
 
    } 
 
    return true; 
 
} 
 

 
var pageHandlerOptions = { 
 
    set: handlePagePropertyChange 
 
}; 
 

 
var page = new Proxy({}, pageHandlerOptions); 
 

 

 
page.x = "x"; 
 
page.y = "y"; 
 
page.article = "0815";
.as-console-wrapper { max-height: 100%!important; top: 0; }

+0

こんにちはピーター、私は質問を編集:私はまだ未定義の関数を持って:/ – user305883

関連する問題