2017-09-01 51 views
0

我正在觀察一個對象,並希望在更改值時調用一個函數。在代理對象(Javascript ECMAscript)中調用外部函數

我可以用Object.observe做到這一點,並希望嘗試使用Proxy進行簡化。

我無法調用外部函數,導致它說未定義。 如何捕捉外部功能?

這裏是我的事:

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 

} 

編輯爲跟進回答

功能doStmg()被調用,並在其中執行//Stuff,除了externalFunction仍然是未定義。 externalFunction通常在別處被調用。

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

代理有一個 '處理' 和 '目標' 是不同的。你的代理目標是'頁面'和處理'pageHandler'你的目標不包含externalFunction所以它是未定義的。你應該將外部函數移動到頁面作爲屬性 –

+0

它適用於我在任何情況下 – MinusFour

+0

謝謝大家。 @ftor @Shyam Babu你能舉個例子嗎?我嘗試了const'page = {externalFunction:externalFunction}',然後在'doSmtg()'中調用它作爲'page.externalFunction'或'target.externalFunction',但沒有奏效。 – user305883

回答

0

對於OP的給出的例子......哪個應該只針對特定的陷阱頁處理器選項不僅配置必須改變,但人們也應該知道,與例如從上面有一個與proxyPage對象一起使用以便運行到set陷阱。否則將不會檢測到直接爲任何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

相關問題