2010-02-18 44 views
1

我使用HtmlPage.Window.Invoke api從SL組件調用javascript,當我調用在頁面(html)中定義的javascript函數時,它按預期方式執行,例如,Silveright調用JavaScript問題?

HtmlPage.Window.Invoke("publishValue", topic, jsonObject); 

但是,當我把JavaScript函數在一個*。js文件是不能執行,即使* .js文件已加載到DOM中的方法,所以下面的失敗並調用異常。

HtmlPage.Window.Invoke("FrameworkEventBroker.publishFrameworkEvent", topic, jsonObject); 

任何想法爲什麼會發生這種情況?

乾杯

AWC

回答

1

的問題是不與(*的.js),它調用不直接附着到窗的實例方法時失敗。

解決方法是將您的方法註冊到窗口對象。爲了簡化這個我創建了一個JavaScript幫手如下:

<script type="text/javascript"> 
function createDelegate(instance, method) { 
    return function() { 
     return method.apply(instance, arguments); 
    } 
} 
function registerBroker(prefix, brokerInstance) { 
    for (var prop in brokerInstance) 
     //uncomment the IF statement to only include properties 
     //starting with upper case letter. 
     //if (prop.charAt(0) >= 'A' && prop.charAt(0) <= 'Z') 
      eval("window."+prefix+"_" + prop + "= createDelegate(brokerInstance, brokerInstance[prop]);"); 
} 
</script> 

然後你只需調用券商方法爲:

HtmlPage.Window.Invoke(
      string.Format("{0}_{1}", PREFIX, METHOD_NAME), Args); 

就是這樣。

實施例:

<script type="text/javascript"> 
    var broker = new FrameworkEventBroker(); 
    registerBroker("FrameworkEventBroker",broker); 
</script> 

和從Silverlight的:

HtmlPage.Window.Invoke("FrameworkEventBroker_publishFrameworkEvent", topic, jsonObject); 

UPDATE

我添加createDelegate方法輔助保持到代理實例的引用的窗口對象上調用時。