встроить сильверлайт в дюрандаль

У меня есть компонент Silverlight Excel, который мне нужно встроить в мое приложение Durandal.

Мой HTML выглядит так:

   <form id="silverlightControl" runat="server" data-bind="if: silverlightIsInstalled() && silverlightData()!=null">
        <div id="silverlightControlHost">
            <object id="silverlightObject" data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%">
                <param name="source" value="ClientBin/SilverlightGrid.xap" />
                <param name="onError" value="onSilverlightError" />
                <param name="onLoad" value="onSilverlightLoad" />
                <param name="background" value="white" />
                <param name="minRuntimeVersion" value="5.0.61118.0" />
                <param name="autoUpgrade" value="false" />
            </object><iframe id="_sl_historyFrame" style="visibility:hidden;height:0px;width:0px;border:0px"></iframe>
        </div>
    </form>

Проблема в том, что это пытается вызвать глобальные функции, называемые onSilverlightLoad и onSilverlightError.

Есть ли способ внутри моего модуля определить и перезаписать эти глобальные функции?


person pilavdzice    schedule 21.03.2014    source источник
comment
Заменить их своими?   -  person SQLMason    schedule 21.03.2014
comment
это не дубликат. См. приведенный выше код, в котором уже есть параметр ‹param name=onLoad value=onSilverlightLoad /›, но другой вопрос не касается того, как определить эту функцию в модулях AMD require.js для одностраничных фреймворков приложений, таких как durandal, где нет глобальных переменных.   -  person pilavdzice    schedule 22.03.2014
comment
Да, мне нужно определить и заменить на свой собственный. С приведенным выше кодом Silverlight вызывает функцию onSilverlightLoad, каждый модуль AMD durandal, который у меня есть, должен перезаписать ее, чтобы выполнялись функции, относящиеся к текущей странице.   -  person pilavdzice    schedule 22.03.2014
comment
Итак... Вы хотите запустить код на стороне сервера из функции JavaScript? Пожалуйста, определите, какой у вас модуль. Я понимаю, почему вы просто не меняете параметр на свою собственную функцию JavaScript и не запускаете ее.   -  person SQLMason    schedule 22.03.2014
comment
Нет. Мой вопрос не имеет ничего общего с серверной частью. Контекст моего вопроса - Дюрандаль (см. заголовок). Я говорю о модуле AMD require.js.   -  person pilavdzice    schedule 24.03.2014
comment
Извините, судя по принятому ответу, я не понял трудности или того, что было неправильно понято в том, что он сделал. Это казалось мне базовым, поэтому я подумал, что что-то упускаю.   -  person SQLMason    schedule 24.03.2014
comment
Где вы, ребята, обычно размещаете код, который должен выполняться в глобальном масштабе в Durandal? Я использовал стартовый комплект, затем отредактировал тег script в Durandal/Index.cshtml, есть ли лучший способ?   -  person pilavdzice    schedule 24.03.2014


Ответы (2)


Есть ли способ внутри моего модуля определить и перезаписать эти глобальные функции?

да, можно было сделать что-то подобное...

в глобальном масштабе:

var currentModule = null;

function onSilverlightLoad(sender, args) {
   if (currentModule && currentModule.onSilverlightLoad) {
       // forward the event to the current module
       currentModule.onSilverlightLoad(sender, args);
       return;
   }
   // fallback logic...
}

function onSilverlightError(sender, args) {
   if (currentModule && currentModule.onSilverlightError) {
       // forward the event to the current module...
       currentModule.onSilverlightError(sender, args);
       return;
   }
   // fallback logic...
}

в вашем модуле:

window.currentModule = this;
// todo: define public function properties named onSilverlightLoad and onSilverlightError
person Jeremy Danyow    schedule 24.03.2014

Совет для тех, кто внедряет Silverlight в приложение Durandal.

Вам нужно сделать это, иначе когда вы покинете эту страницу и вернетесь на нее, произойдет что-то плохое:

vm.binding = function () { return { cacheViews: false }; };

person pilavdzice    schedule 24.03.2014