не стесняйтесь переходить к вопросу ниже
Я пытаюсь создать мост, чтобы огромное приложение 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 ...
Если у вас есть какие-либо идеи, пожалуйста, поделитесь ими здесь, я пытался исправить это в течение последней недели, но безрезультатно: - (