Доступ к createObject Silverlight через новый оператор Javascript? - PullRequest
0 голосов
/ 21 августа 2009

не стесняйтесь переходить к вопросу ниже

Я пытаюсь создать мост, чтобы огромное приложение javascript можно было заменить как можно более плавно на новую переписанную версию на основе Silverlight.

В унаследованном приложении есть класс JS:

function LatLng(lat, lng, url) { /* snip... */ }

И он часто используется в кодовой базе моего клиента, например:

var ll = new LatLng(12, 34, '567');

Однако, поскольку мост в Silverlight должен быть обратно совместимым и чтобы это было сделано с максимальной ремонтопригодностью, я решил воссоздать класс LatLng как ScriptableType в Silverlight:

[ScriptableType]
public class LatLng { /* similar snipped stuff ... */ }

По мере того, как я продолжаю реализовывать методы в классе в Silverlight / C #, я дошел до того, что запросил и реализовал этот делегат util . Который позволил мне связывать вызовы со стороны Javascript прямо в среду выполнения Silverilght с изменением 0, выполнив это:

var x = new LatLng() // <-- constructor now calls into Silverlight
                     //     and ask for methods to be wired into it

К сожалению, этот подход не работает с геттерами / установщиками свойств , поскольку в JavaScript такого понятия нет (по крайней мере, не во всех основных браузерах), единственный способ получить геттеры / сеттеры свойств работать - это позволить среде исполнения Silverlight создать оболочку для моего класса

т.е. экземпляр должен быть создан из Content.services.createObject в JavaScript:

var ll = silverlightObject.Content.services.createObject("LatLng");

Это единственное изменение потребует всех существующих пользователей приложения для перехода на всю их кодовую базу для обновления ... не очень хорошо


Проблема

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

var ll = new LatLng(13, 100)
/*        ^
          ^
   should returns instance created from
   silverlightObject.Content.services.createObject
*/

И есть 2 ошибки:

  • createObject - это функция, управляемая Silverlight, Function.apply или Function.call не работает
  • Результат от createObject - это обертка, которую вы не можете перебрать (поэтому я спрашиваю делегат утилит во-первых)

Надеюсь, что выход есть, и не нужно, чтобы каждый клиент проходил через изменение способа создания LatLng ...

Если у вас есть какие-либо идеи, пожалуйста, поделитесь ими здесь, я пытался исправить это в течение последней недели, но безрезультатно: - (

1 Ответ

0 голосов
/ 21 августа 2009

Новая команда в JavaScript представляет собой экземпляр функции без фактического использования базовой функции. Это важно для защиты внутренних механизмов функции от помех в ожидании повторного использования.

Чтобы обойти новую команду, я бы преобразовал функцию LatLng в метод. Метод - это функция, которая выполняется с использованием точечной нотации с целью изменения переменной с сохраненным значением. Оригинальная функция LatLng содержала 3 аргумента. При переписывании LatLng переписать нужно только первые два аргумента, чтобы переменная, которая будет активировать метод, могла содержать то, что изначально было третьим аргументом.

var ll.LatLng (13, 100);

Но помните, что переменная должна иметь значение до того, как к ней будет выполнен какой-либо метод, иначе она может выдать ошибку. Вот почему я рекомендую использовать исходный третий аргумент LatLng вместо значения переменной перед использованием метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...