Добрый вечер, при смене проекта пропадали внешнии функции слоя. Копаясь в коде исправил код на следующий и проблема решена: /** * Открыть проект карты * @method projectStart * @param options {Object} параметры карты * @param id {String} идентификатор проекта */ openProject: function (options, id) { if (!this.map || !options || !id) { return; }
var i, len = options.layers.length; for (i = 0; i < len; i++) { var infotype = typeof options.layers[i].additionalInfo; if (infotype != 'undefined' && infotype == 'string') { if (options.layers[i].additionalInfo.length > 0) { var func = getFunc(options.layers[i].additionalInfo); options.layers[i].additionalInfo = func; } } } function getFunc(a){ var scope = window; var scopeSplit = a.split('.'); for (var i = 0, l = scopeSplit.length - 1; i < l; i++){ scope = scope[scopeSplit[i]]; } return scope[scopeSplit[scopeSplit.length - 1]]; } var parent = this.map.divID;
this.map._clearCookie();
this.map.destroy(true);
this.map = new GWTK.Map(parent, options);
if ($.isFunction(this.handler_openProject)) { this.handler_openProject(this.map); }
Вы в Вашем приложении можете использовать предложенный вариант - getFunc. Но это не универсально. При записи типа namespace1.namespase2.func работать не будет. Надежней, чтобы функция additionalInfo была определена в window, например showAdditionalInfo = function(parm){ if (window.gi){ gi.additionalInfo(parm); } }
var scope - ссылка на window в функции geFunc. Мною протестировано на универсальность и функции типа func.a.b.c работают. В вашем коде было window[func.a] и возращало undefined, а должно быть window[func][a]
Да, действительно. Я не увидела строку scope = window; ! В нашем коде, как указано в документации - функция, расположенная в window. Но ваш вариант хороший.