Вопрос

Как получить значение атрибута в схеме?

В общем задам вопрос отдельно.

В  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": '<iframe name="iframe" id="iframe" width="100%" height="700px"' +
			  		'src="https://domain.com/base.php'+
					'?owner='+
					Terrasoft.SysValue.CURRENT_USER.value + 
					'&leadid='+ 
 
	//Вот сюда надо получить значение атрибута
 
			   		'" frameborder="0"></iframe>',
                    "visible": {"bindTo": "isTimelineDataView"}
             	}

 

Нравится

11 комментариев

Создайте атрибут с нужной вам ссылкой (пecnfyjdbnm его например в init)

забиньте  html на ваш атрибут с сылкой

Пример можно посмотреть в методе getRecommendationConfig схемы GlobalSearchResultPage

 

Григорий Чех,

Я вроде пробую забиндить, только не получается, те пишу в Init пишу

this.set("iframeUrl", '&lt;iframe name="iframe" id="iframe" width="100%" height="700px"' +
					'src="https://domain.com'+
					'" frameborder="0"&gt;&lt;/iframe&gt;');

Затем в 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 = '&lt;iframe name="iframe" id="iframe" width="100%" height="700px"' +
					'src="https://domain.com'+
					'/'+
		             Terrasoft.SysValue.CURRENT_USER.value + 
					'/'+ 
			 		leadGuid +
					'" frameborder="0"&gt;&lt;/iframe&gt;';
 
        	}
			else
			{
				var strFrame = '&lt;iframe name="iframe" id="iframe" width="100%" height="700px"' +
					'src="https://domain.com'+
					'/'+
		             Terrasoft.SysValue.CURRENT_USER.value + 
					'" frameborder="0"&gt;&lt;/iframe&gt;';
 
			}	
			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(); 

Зверев Александр,

 А тут страница раздела, не срабатывает(( Пишет this.reloadEntity() is not a function. Я уже все перепробовал - не совсем пойму, вот у меня в DIFF формируется html и там есть вызов функции (getIframe). Так вот она отрабатывает только если F5 сделать, и все. Такое ощущение, что один раз этот код отработал и все, держит в кэше где-то.

Потом ходишь по меню - никаких изменений. Пробовал на Onrender повесить изменение DOM - тоже не работает, вроде как DOM уже есть, меняю src и ничего, все перезаписывается, в общем везде затык. А после onrender методов и нет никаких.



 

Зверев Александр,

При этом методы Init и OnRender отрабатывают при каждом переходе.

Вопрос - как мне в них изменить массив Values элемента. Если я сделаю как-то через bindTo (хотя не получилось через атрибут - просто не грузится) - это должно работать или также закэшируется, как и обычная функция?

Есть несколько статей и тем о добавлении iframe на страницу. Посмотрите, возможно, в них добиваются того, что Вы хотите сделать.

Показать все комментарии