В общем задам вопрос отдельно.
В ActivitySectionV2 я добавил свой атрибут
"activeLeadId":{
DataValueType: Terrasoft.DataValueType.STRING
}В методе загрузки представления я устанавливаю его значение через this.set - все замечательно, вывожу сообщение - там то, что мне нужно.
А вот затем я формирую состав Url для iframe и мне нужно получить его значение. Не пойму как. Через this.get не работает.
diff: /**SCHEMA_DIFF*/[
{
"operation": "insert",
"name": "iframe",
"parentName": "DataViewsContainer",
"propertyName": "items",
"values": {
"id": "iframe",
"selectors": {"wrapEl": "#iframe"},
"itemType": Terrasoft.ViewItemType.CONTAINER,
"layout": { "colSpan": 24, "rowSpan": 1, "column": 0, "row": 4 },
"html": '',
"visible": {"bindTo": "isTimelineDataView"}
}
Нравится
Создайте атрибут с нужной вам ссылкой (пecnfyjdbnm его например в init)
забиньте html на ваш атрибут с сылкой
Пример можно посмотреть в методе getRecommendationConfig схемы GlobalSearchResultPage
Григорий Чех,
Я вроде пробую забиндить, только не получается, те пишу в Init пишу
this.set("iframeUrl", '<iframe name="iframe" id="iframe" width="100%" height="700px"' +
'src="https://domain.com'+
'" frameborder="0"></iframe>');Затем в Diff
diff: /**SCHEMA_DIFF*/[
{
"operation": "insert",
"name": "iframe",
"parentName": "DataViewsContainer",
"propertyName": "items",
"values": {
"id": "iframe",
"selectors": {"wrapEl": "#iframe"},
"itemType": Terrasoft.ViewItemType.CONTAINER,
"layout": { "colSpan": 24, "rowSpan": 1, "column": 0, "row": 4 },
"html":{"bindTo": "iframeUrl"},
"visible": {"bindTo": "isTimelineDataView"}
}
},И ничего не выводит, только заголовок секции - дальше пусто. Если в "html" прописываю код напрямую, то все работает.
Проблема даже в другом, я в методе Init задаю значение переменной, оно выводится корректно. Но, когда эту переменную использую в values, мне формируется url предыдущий, как из кэша.
Те через переменную сформировать нужный html получается, но выводится старое значение, через атрибут не получается получить значение((
Особенно с переменной непонятно, на каком уровне кэшируется все. Если просто alert или в консоль, но значение правильное, а в iframe старое из предыдущего открытия этой страницы.
В итоге, вместо атрибута я смог вставлять туда функцию обычную, но вот проблема - она не вызывается, если не делать рефреш страницы. Те неважно, какой там код внутри DIFF, он просто не вызывается. Те получается, неважно как я получаю ID, будь то URL или любой другой способ, чтобы вставить его в iframe - нужно как-то его обновить принудительно.
Вот вопрос - как это побороть?
Вот полный исходный код на текущий момент. Куда копать в части принудительного обновления и/или сброса кэша?
define("ActivitySectionV2", [], function() {
var currentLocation = '';
var leadGuid = '';
function getFrame()
{
currentLocation = window.location+'';
leadGuid = getAllUrlParams(currentLocation).guid;
if (leadGuid != null)
{
var strFrame = '<iframe name="iframe" id="iframe" width="100%" height="700px"' +
'src="https://domain.com'+
'/'+
Terrasoft.SysValue.CURRENT_USER.value +
'/'+
leadGuid +
'" frameborder="0"></iframe>';
}
else
{
var strFrame = '<iframe name="iframe" id="iframe" width="100%" height="700px"' +
'src="https://domain.com'+
'/'+
Terrasoft.SysValue.CURRENT_USER.value +
'" frameborder="0"></iframe>';
}
alert(strFrame);
return strFrame;
}
//Функция получения параметра из businessRules
function getAllUrlParams(url) {
//код функции .....
return obj;
}
return {
entitySchemaName: "Activity",
mixins: {},
attributes: {
"isTimelineVisible": {
dataValueType: Terrasoft.DataValueType.BOOLEAN
},
// "activeLeadId":{
// DataValueType: Terrasoft.DataValueType.STRING
//},
// "iframeUrl":{
// DataValueType: Terrasoft.DataValueType.TEXT
// }
},
messages: {},
methods: {
getDefaultDataViews: function(){
var baseDataViews = this.callParent();
baseDataViews.TimelineDataView = {
index: 3,
name: "TimelineDataView",
caption: "Расписание",
hint: "Таймлайн",
icon: this.get("Resources.Images.SchedulerDataViewIcon")
};
return baseDataViews;
},
loadTimelineDataView: function(loadData) {
this.set("IsActionButtonsContainerVisible", true);
this.set("isTimelineVisible", true);
this.set("IsAnalyticsActionButtonsContainerVisible", false);
if (loadData === false) {
return;
}
},
isTimelineDataView: function() {
return (this.get("ActiveViewName") === "TimelineDataView");
},
isNotTimelineDataView: function() {
return !this.isTimelineDataView();
}
},
rules: {},
businessRules: /**SCHEMA_BUSINESS_RULES*/{}/**SCHEMA_BUSINESS_RULES*/,
modules: /**SCHEMA_MODULES*/{}/**SCHEMA_MODULES*/,
diff: /**SCHEMA_DIFF*/[
{
"operation": "insert",
"name": "iframe",
"parentName": "DataViewsContainer",
"propertyName": "items",
"values": {
"id": "iframe",
"selectors": {"wrapEl": "#iframe"},
"itemType": Terrasoft.ViewItemType.CONTAINER,
"layout": { "colSpan": 24, "rowSpan": 1, "column": 0, "row": 4 },
"html":getFrame(),
"visible": {"bindTo": "isTimelineDataView"}
}
},
{
"operation": "merge",
"name": "GridUtilsContainer",
"propertyName": "items",
"values": {
'visible': {"bindTo": "isNotTimelineDataView"}
}
}
]/**SCHEMA_DIFF*/
};
});
Зверев Александр,
А тут страница раздела, не срабатывает(( Пишет this.reloadEntity() is not a function. Я уже все перепробовал - не совсем пойму, вот у меня в DIFF формируется html и там есть вызов функции (getIframe). Так вот она отрабатывает только если F5 сделать, и все. Такое ощущение, что один раз этот код отработал и все, держит в кэше где-то.
Потом ходишь по меню - никаких изменений. Пробовал на Onrender повесить изменение DOM - тоже не работает, вроде как DOM уже есть, меняю src и ничего, все перезаписывается, в общем везде затык. А после onrender методов и нет никаких.
Зверев Александр,
При этом методы Init и OnRender отрабатывают при каждом переходе.
Вопрос - как мне в них изменить массив Values элемента. Если я сделаю как-то через bindTo (хотя не получилось через атрибут - просто не грузится) - это должно работать или также закэшируется, как и обычная функция?