Silveright вызывает проблему с JavaScript? - PullRequest
1 голос
/ 18 февраля 2010

Я обращаюсь к javascript из компонента SL с помощью API HtmlPage.Window.Invoke, когда я вызываю функцию javascript, определенную на странице (html), которую она выполняет должным образом, например,

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

Но когда я помещаю функцию javascript в файл * .js, он не может выполнить метод, даже если файл * .js был загружен в DOM, поэтому следующая ошибка завершается с исключением из-за вызова.

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

Есть идеи, почему это происходит?

Приветствия

AWC

1 Ответ

1 голос
/ 05 октября 2010

Проблема не в (* .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>

и от серебряного света:

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

ОБНОВЛЕНИЕ

Я добавил помощник createDelegate для поддержки ссылки на экземпляр посредника при вызове объекта window.

...