powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Доступ к атрибутам плагина из javascript
42 сообщений из 42, показаны все 2 страниц
Доступ к атрибутам плагина из javascript
    #38880235
Diagnost89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

Пишу простенький dynamic action плагин.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
function render (
    p_dynamic_action in apex_plugin.t_dynamic_action,
    p_plugin         in apex_plugin.t_plugin )
    return apex_plugin.t_dynamic_action_render_result
is
render_result apex_plugin.t_dynamic_action_render_result default null;
begin
apex_javascript.add_library(
	p_name => 'validator',
    p_directory => p_plugin.file_prefix,
    p_version => null
);
render_result.attribute_01 := p_dynamic_action.attribute_01;
render_result.attribute_02 := p_dynamic_action.attribute_02;
render_result.javascript_function := 'init_validators';
return render_result;
end;



Первый атрибут - список итемов для проверки.
Второй атрибут - список кнопок, которые надо лочить, если хоть один из итемов пустой.

Файл validator.js:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
function reset() {
	var items = init_validators.prototype.action.attribute01.split(',');
	var buttons = init_validators.prototype.action.attribute02.split(',');
}

function init_validators() {
	var items = this.action.attribute01.split(',');
	var buttons = this.action.attribute02.split(',');
}



Функция init_validators определена как точка входа в pl/sql коде плагина и внутри нее доступ к атрибутам осуществляется через this.action.
А внутри функции reset получить доступ к этим атрибутам уже нельзя. пробовал решить это через глобальные переменные, но этот способ не подходит потому что если подключать плагин более одного раза на страницу то эти переменные затираются последующими вызовами. Какой подход поможет в данной ситуации?
...
Рейтинг: 0 / 0
Доступ к атрибутам плагина из javascript
    #38880484
blkangel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Diagnost89,

Тут очень простой выход.
Внутри функции init_validators(), создай объект, из из любой другой обращайся к нему.

Код: javascript
1.
2.
3.
4.
var myObj = {
	items : this.action.attribute01.split(','),
	buttons : this.action.attribute02.split(',')
};



Обращение к объекту
Код: javascript
1.
myObj.items;



Ну это ближе к Яваскрипту уже.
...
Рейтинг: 0 / 0
Доступ к атрибутам плагина из javascript
    #38880502
blkangel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
blkangel,

Ах да, и функцию ресет внутри объекта надо разместить, тогда путаницы не будет.

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
var myObj = {
	items : this.action.attribute01.split(','),
	buttons : this.action.attribute02.split(','),
	reset : function () {
		var me=this;
		console.log(me.items);
		console.log(me.buttons);
	}
};
...
Рейтинг: 0 / 0
Доступ к атрибутам плагина из javascript
    #38880530
blkangel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
blkangel,

И еще, для того чтобы объекты не пересекались.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
function render (
    p_dynamic_action in apex_plugin.t_dynamic_action,
    p_plugin         in apex_plugin.t_plugin )
    return apex_plugin.t_dynamic_action_render_result
is
render_result apex_plugin.t_dynamic_action_render_result default null;
begin
apex_javascript.add_library(
	p_name => 'validator',
    p_directory => p_plugin.file_prefix,
    p_version => null
);
render_result.attribute_01 := p_dynamic_action.attribute_01;
render_result.attribute_02 := p_dynamic_action.attribute_02;
render_result.javascript_function := 'init_validators("'||to_char(p_dynamic_action.id)||'")';
return render_result;
end;




Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
function init_validators(aId) {
	var myObj={};
	var myObj[aId] = {
		items : this.action.attribute01.split(','),
		buttons : this.action.attribute02.split(','),
		reset : function () {
			var me=this;
			console.log(me.items);
			console.log(me.buttons);
		}
	};
};
...
Рейтинг: 0 / 0
Доступ к атрибутам плагина из javascript
    #38880578
Diagnost89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
blkangel,

при построении объекта происходит вот такая ошибка:
Uncaught TypeError: Cannot read property 'attribute01' of undefined

видимо потому что this уже не к контексту функции set_validators обращается, а к контексту объекта

да и получить доступ потом извне никак. смысл в том что есть функция set_validators. она соответствующим полям привязывала обработчики их изменения:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
function validator(item_id, items, inputs) {
    return function() {
        $('#' + item_id).on('focus click', function() {
            hide_tooltip(item_id);
        });
        $('#' + item_id).on('input blur', function () {
            if (item_is_empty(item_id)) {
                if (!production_mode)
                    console.log('item "' + item_id + '" is invalid. disabling all inputs');
                set_error_colors(item_id);
                show_tooltip(item_id, 'Обязательное поле');
                for (var i in inputs) {
                    disable_input(inputs[i]);
                }
            } else {
                hide_tooltip(item_id);
                if (!production_mode)
                    console.log('item "' + item_id + '" is valid. checking all items');
                set_valid_colors(item_id);
                var with_errors = false;
                for (var j in items) {
                    if (item_is_empty(items[j])) {
                        with_errors = true;
                        if (!production_mode)
                            console.log('item "' + items[j] + '" is invalid. disabling all inputs');
                        break;
                    }
                }
                if (!with_errors) {
                    if (!production_mode)
                        console.log('all items is valid. enabling all inputs');
                }
                for (var k in inputs) {
                    if (with_errors) {
                        disable_input(inputs[k]);
                    } else {
                        enable_input(inputs[k]);
                    }
                }
            }
        });
    };
}

function set_validators(dynamic_action_id) {
    var items = this.action.attribute01.split(',');
    var inputs = this.action.attribute02.split(',');

    for (var i in items) {
        var f = validator(items[i], items, inputs);
        f();
}



а еще должна быть отдельная функция reset_interface, которая бы убирала у полей сообщения об ошибках и сбрасывала цвет в обычный. у меня до этого приходилось на странице вызывать ее так: reset_interface( ['P50_X1', 'P50_X2'], ['P50_B1', 'P50_B2'] ) и это работало. но хотелось бы чтобы эта функция имела доступ к атрибутам плагина и вызов был reset_interface(). правда тут еще проблема определить, к какому плагину соответствует этот вызов
...
Рейтинг: 0 / 0
Доступ к атрибутам плагина из javascript
    #38880701
blkangel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Diagnost89blkangel,

при построении объекта происходит вот такая ошибка:
Uncaught TypeError: Cannot read property 'attribute01' of undefined

видимо потому что this уже не к контексту функции set_validators обращается, а к контексту объекта

да и получить доступ потом извне никак. смысл в том что есть функция set_validators. она соответствующим полям привязывала обработчики их изменения:

Виноват, так конечно:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
function init_validators(aId) {
	var meFun=this;
	var myObj={};
	var myObj[aId] = {
		items : meFun.action.attribute01.split(','),
		buttons : meFun.action.attribute02.split(','),
		reset : function () {
			var me=this;
			console.log(me.items);
			console.log(me.buttons);
		}
	};
};
...
Рейтинг: 0 / 0
Доступ к атрибутам плагина из javascript
    #38880702
blkangel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
blkangelDiagnost89blkangel,

при построении объекта происходит вот такая ошибка:
Uncaught TypeError: Cannot read property 'attribute01' of undefined

видимо потому что this уже не к контексту функции set_validators обращается, а к контексту объекта

да и получить доступ потом извне никак. смысл в том что есть функция set_validators. она соответствующим полям привязывала обработчики их изменения:

Виноват, так конечно:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
function init_validators(aId) {
	var meFun=this;
	var myObj={};
	var myObj[aId] = {
		items : meFun.action.attribute01.split(','),
		buttons : meFun.action.attribute02.split(','),
		reset : function () {
			var me=this;
			console.log(me.items);
			console.log(me.buttons);
		}
	};
};


Еще чутка исправления.
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
function init_validators(aId) {
	var meFun=this;
	if (!myObj) {
		var myObj={};
	};
	var myObj[aId] = {
		items : meFun.action.attribute01.split(','),
		buttons : meFun.action.attribute02.split(','),
		reset : function () {
			var me=this;
			console.log(me.items);
			console.log(me.buttons);
		}
	};
};
...
Рейтинг: 0 / 0
Доступ к атрибутам плагина из javascript
    #38880712
blkangel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Diagnost89blkangel,
да и получить доступ потом извне никак. смысл в том что есть функция set_validators. она соответствующим полям привязывала обработчики их изменения:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
function validator(item_id, items, inputs) {
    return function() {
        $('#' + item_id).on('focus click', function() {
            hide_tooltip(item_id);
        });
        $('#' + item_id).on('input blur', function () {
            if (item_is_empty(item_id)) {
                if (!production_mode)
                    console.log('item "' + item_id + '" is invalid. disabling all inputs');
                set_error_colors(item_id);
                show_tooltip(item_id, 'Обязательное поле');
                for (var i in inputs) {
                    disable_input(inputs[i]);
                }
            } else {
                hide_tooltip(item_id);
                if (!production_mode)
                    console.log('item "' + item_id + '" is valid. checking all items');
                set_valid_colors(item_id);
                var with_errors = false;
                for (var j in items) {
                    if (item_is_empty(items[j])) {
                        with_errors = true;
                        if (!production_mode)
                            console.log('item "' + items[j] + '" is invalid. disabling all inputs');
                        break;
                    }
                }
                if (!with_errors) {
                    if (!production_mode)
                        console.log('all items is valid. enabling all inputs');
                }
                for (var k in inputs) {
                    if (with_errors) {
                        disable_input(inputs[k]);
                    } else {
                        enable_input(inputs[k]);
                    }
                }
            }
        });
    };
}

function set_validators(dynamic_action_id) {
    var items = this.action.attribute01.split(',');
    var inputs = this.action.attribute02.split(',');

    for (var i in items) {
        var f = validator(items[i], items, inputs);
        f();
}



а еще должна быть отдельная функция reset_interface, которая бы убирала у полей сообщения об ошибках и сбрасывала цвет в обычный. у меня до этого приходилось на странице вызывать ее так: reset_interface( ['P50_X1', 'P50_X2'], ['P50_B1', 'P50_B2'] ) и это работало. но хотелось бы чтобы эта функция имела доступ к атрибутам плагина и вызов был reset_interface(). правда тут еще проблема определить, к какому плагину соответствует этот вызов

А тут давай подробно разбирать...
1. Раз ты делаешь плагин, он должен быть независим, и не требовать дописок яваскрипта на страницах.
2. Предположим, что ты делаешь API для своего плагина, и тебе надо все таки из вне вызывать функцию. Загвоздка в том, что dynamic_action_id ты никогда не вычислишь из вне, но тут напрашивается вывод сам собой, ты должен третьим атрибутом передавать название объекта. И получится примерно так.
pl/sql упростится

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
function render (
    p_dynamic_action in apex_plugin.t_dynamic_action,
    p_plugin         in apex_plugin.t_plugin )
    return apex_plugin.t_dynamic_action_render_result
is
render_result apex_plugin.t_dynamic_action_render_result default null;
begin
apex_javascript.add_library(
	p_name => 'validator',
    p_directory => p_plugin.file_prefix,
    p_version => null
);
render_result.attribute_01 := p_dynamic_action.attribute_01;
render_result.attribute_02 := p_dynamic_action.attribute_02;
render_result.javascript_function := 'init_validators()';
return render_result;
end;



javascript :
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
function init_validators() {
	var meFun=this;
	if (!myObj) {
		var myObj={};
	};
	var myObj[meFun.action.attribute03] = {
		items : meFun.action.attribute01.split(','),
		buttons : meFun.action.attribute02.split(','),
		reset : function () {
			var me=this;
			console.log(me.items);
			console.log(me.buttons);
		},
		setValidation : function () {
			var me=this;
			for (var i in me.items) {	
				var f = me.validator(me.items[i], me.items, me.inputs);
			}
		},
		validator : function(item_id, items, inputs) {
			....
		}
	};
};



Вызов функций внутри объекта, так.
Код: javascript
1.
myObj.attribute03.reset();
...
Рейтинг: 0 / 0
Доступ к атрибутам плагина из javascript
    #38880753
Diagnost89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В данный момент остановился на таком варианте:

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
function disable_input(id) {
    $('#'+id).prop('disabled', 'disabled');
}

function enable_input(id) {
    $('#'+id).removeAttr('disabled');
}

function set_valid_colors(item_id) {
    $('label[for='+item_id+']>span,label[for='+item_id+']>a').css('color', '#444');
    $('#'+item_id).css('border', '1px solid rgb(170,170,170)');
}

function set_error_colors(item_id) {
    $('label[for='+item_id+']>span,label[for='+item_id+']>a').css('color', '#b94a48');
    $('#'+item_id).css('border', '1px solid #b94a48');
}

function item_is_empty(item_id) {
    return $('#'+item_id).val() == '';
}

function show_tooltip(item_id, message) {
    var td = $('#'+item_id).parent('td');
    $(td).css('position', 'relative');
    $('<div class="tooltip-container"><span class="tooltip-message">'+message+'</span></div>').appendTo(td);
}

function hide_tooltip(item_id) {
    var td = $('#'+item_id).parent('td');
    $(td).find('.tooltip-container').remove();
}

var production_mode = true;

function reset_interface(form_id) {
    var with_errors = false;
    var item_arr = $('#' + form_id + ' .not_empty_item');
    var input_arr = $('#' + form_id + ' .not_empty_button');
    for (var i in item_arr) {
        set_valid_colors(item_arr.get(i).id);
        hide_tooltip(item_arr.get(i).id);
        if (item_is_empty(item_arr.get(i).id)) {
            with_errors = true;
        }
    }
    for (var i in input_arr) {
        if (with_errors)
            disable_input(input_arr.get(i).id);
        else
            enable_input(input_arr.get(i).id);
    }
    if (!production_mode)
        console.log('interface reseted');
}

function validator(item_id, items, inputs) {
    return function() {
        $('#' + item_id).on('focus click', function() {
            hide_tooltip(item_id);
        });
        $('#' + item_id).on('input blur', function () {
            if (item_is_empty(item_id)) {
                if (!production_mode)
                    console.log('item "' + item_id + '" is invalid. disabling all inputs');
                set_error_colors(item_id);
                show_tooltip(item_id, 'Обязательное поле');
                for (var i in inputs) {
                    disable_input(inputs[i]);
                }
            } else {
                hide_tooltip(item_id);
                if (!production_mode)
                    console.log('item "' + item_id + '" is valid. checking all items');
                set_valid_colors(item_id);
                var with_errors = false;
                for (var j in items) {
                    if (item_is_empty(items[j])) {
                        with_errors = true;
                        if (!production_mode)
                            console.log('item "' + items[j] + '" is invalid. disabling all inputs');
                        break;
                    }
                }
                if (!with_errors) {
                    if (!production_mode)
                        console.log('all items is valid. enabling all inputs');
                }
                for (var k in inputs) {
                    if (with_errors) {
                        disable_input(inputs[k]);
                    } else {
                        enable_input(inputs[k]);
                    }
                }
            }
        });
    };
}

function class_adder(item_id, class_name) {
    return function() {
        $('#' + item_id).addClass(class_name);
    }
}

function set_validators() {

    var items = this.action.attribute01.split(',');
    var inputs = this.action.attribute02.split(',');

    for (var i in items) {
        var f = validator(items[i], items, inputs);
        f();
        var ca = class_adder(items[i], 'not_empty_item');
        ca();
    }
    for (var i in inputs) {
        var ca = class_adder(inputs[i], 'not_empty_button');
        ca();
    }
}



на странице несколько регионов. чтобы очистить элементы на определенном регионе, на странице дописал такую строчку:

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
$('#REGION_APP').dialog({
    autoOpen: false,
    resizable: false,
    modal: true,
    width: '800px',
    maxWidth: 800,
    open: function() {
        reset_interface($(this).get(0).id); // $(this).get(0).id - это как раз id родительского региона
    }
});
...
Рейтинг: 0 / 0
Доступ к атрибутам плагина из javascript
    #38880772
blkangel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Diagnost89,

Ну я понял, что в итоге ты меня проигнорировал.
Ответь мне вот на такой вопрос. Вот эти функции, ты где цепляешь к странице?
Внутри плагина? Тогда, как же ты решил проблему многократного использования плагина?
На странице? Тогда это полуплагин...
...
Рейтинг: 0 / 0
Доступ к атрибутам плагина из javascript
    #38880775
Diagnost89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
по поводу вашего кода: вы в pl/sql не добавили 3-й атрибут и не написали про него что он должен содержать. я не очень понял. и еще:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
function init_validators() {
	var meFun=this;
	if (!myObj) {
		var myObj={};
	};
	var myObj[meFun.action.attribute03] = {
		items : meFun.action.attribute01.split(','),
		buttons : meFun.action.attribute02.split(','),
		reset : function () {
			var me=this;
			console.log(me.items);
			console.log(me.buttons);
		},
		setValidation : function () {
			var me=this;
			for (var i in me.items) {	
				var f = me.validator(me.items[i], me.items, me.inputs);
			}
		},
		validator : function(item_id, items, inputs) {
			....
		}
	};
};


допустим я создам локальную переменную myObj внутри init_validators. но достучаться до нее будет нельзя извне этой функции.

ситуация следующая: вот я создал на странице три региона. каждый из регионов изначально не отображается на странице, это делается через jquery ui dialog при нажатии на кнопку "добавить". в каждом регионе по два поля ввода и по одной кнопке. соответственно на
странице 3 динамик экшена, каждый при Page Load выполняет мой плагин, который привязывает обработчики событий к соответствующим элементам.

а теперь мне надо добавить следующую логику: при открытии каждого из этих регионов элементы интерфейса этого региона должны сбрасываться функцией reset_interface. сейчас проблема решена передачей в эту функцию id родительского региона. функция ищет в этом регионе элементы предопределенных классов ( у меня это not_empty_item и not_empty_button ) и работает с ними. по-другому вроде никак и не сделать
...
Рейтинг: 0 / 0
Доступ к атрибутам плагина из javascript
    #38880788
Diagnost89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну сейчас это не совсем то, чего я добивался. но непонятно, как сделать так, чтобы работало
...
Рейтинг: 0 / 0
Доступ к атрибутам плагина из javascript
    #38880792
Diagnost89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вызов reset_interface происходит на странице...
...
Рейтинг: 0 / 0
Доступ к атрибутам плагина из javascript
    #38880797
blkangel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Diagnost89,
Жестььььь........
Это называется, а не зайти ли мне с опы к данной проблеме.
Извините за мат, НАХЕРА ПЛАГИН? Чтобы бы посложнее все остальным было разобраться? Почему нельзя повесить ПРОСТО обработчик? Ну давайте tot дальше пойдем, сделаем плагин региона(рисовать элементы будет), на который навесим плагин DA (обработчики вешать).

Можно увидеть не решение задачи, а саму задачу?
...
Рейтинг: 0 / 0
Доступ к атрибутам плагина из javascript
    #38880813
Diagnost89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в виде плагина я это оформил потому что планирую это на всех страницах впилить. с валидацией то все как раз хорошо. одна проблема только с получением атрибутов из других функций. вы предложили локальную переменную создать, но если к ней доступа извне нет то зачем это? сейчас не самое красивое, но рабочее решение
...
Рейтинг: 0 / 0
Доступ к атрибутам плагина из javascript
    #38880900
blkangel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Diagnost89,

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

Создание индивидуального объекта, внутри плагина, решает проблему многоразового использования этого плагина. Почему вы не можете обратится к объекту из вне, я не понимаю...

А так же рассмотрите такой вариант, он мне кажется куда проще, чем плагин, тем более, что с яваскриптом на ты.
Объекты можно создавать динамически, например, вы определяете глобальную функцию, на весь апекс.
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
function myMultiObject (items,inputs)  {
	myMultiObject=this;
	myMultiObject.items=items;
	myMultiObject.items=inputs
	myMultiObject.reset=function() {
		var me=this;
		console.log(me.items);
		console.log(me.buttons);
	};
	myMultiObject.setValidation =function () {
		var me=this;
		for (var i in me.items) {	
			var f = me.validator(me.items[i], me.items, me.inputs);
		}
	};
	myMultiObject.validator : function(item_id, items, inputs) {
			....
	};
};
//И вызывать их в хеадере региона 
var newObj = new  myMultiObject("PXX_PPP;PXX_PPP3;PXX_PPP2;PXX_PPP1;","INPUT1;INPUT2;INPUT3;INPUT4;INPUT5;")
...
Рейтинг: 0 / 0
Доступ к атрибутам плагина из javascript
    #38880911
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Diagnost89,
вы так и не ответили - цель вашего плагина.
- есть штатная система валидации
- есть штатная Read only
- есть штатная для рендеринга Condition.
Чем они не устроили?
Возможно вы экономите на спичках, а 90 процентов времени будет уходить на логику страницы, а не на то что вы пишите.
imho
...
Рейтинг: 0 / 0
Доступ к атрибутам плагина из javascript
    #38881011
Diagnost89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
цель - сделать так, чтобы унифицированно проверялись поля. и если они введены неправильно то выводились сообщения об ошибках и блокировались кнопки на форме (например блокировалась кнопка "сохранить"). это сейчас решено и управляется декларативно. тут все ок. сама проблема в том что нужна еще функция, которая сбрасывает состояние региона в начальное состояние. сейчас она решена как раз не совсем хорошо - вызовом функции в футере региона.

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<script>
$('#REGION_APP').dialog({
    autoOpen: false,
    resizable: false,
    modal: true,
    width: '800px',
    maxWidth: 800,
    open: function() {
        reset_interface($(this).get(0).id);
    }
});
</script>



то есть если форму неправильно заполнили и потом закрыли то при открытии это уже не будет отображаться
...
Рейтинг: 0 / 0
Доступ к атрибутам плагина из javascript
    #38881023
Diagnost89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а с вашим примером который вы уже много раз предложили я так и не могу разобраться.

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
function say() {
	say = this;
	say.hello = function() {
		alert('hello, world!');
	};
}

say.hello(); // Uncaught TypeError: undefined is not a function
...
Рейтинг: 0 / 0
Доступ к атрибутам плагина из javascript
    #38881061
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Diagnost89цель - сделать так, чтобы унифицированно проверялись поля. и если они введены неправильно то выводились сообщения об ошибках и блокировались кнопки на форме (например блокировалась кнопка "сохранить").
- Validations смотрели? Хотя я предпочитаю проверки на сервере в триггере.
- DA - Event type - блокировка кнопок смотрели?
...
Рейтинг: 0 / 0
Доступ к атрибутам плагина из javascript
    #38881365
blkangel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Diagnost89а с вашим примером который вы уже много раз предложили я так и не могу разобраться.

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
function say() {
	say = this;
	say.hello = function() {
		alert('hello, world!');
	};
};

say.hello(); // Uncaught TypeError: undefined is not a function


Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
function say() {
	say = this;
	say.hello = function() {
		alert('hello, world!');
	};
};
var mySay =new say();
mySay.hello();
...
Рейтинг: 0 / 0
Доступ к атрибутам плагина из javascript
    #38881480
blkangel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Diagnost89то есть если форму неправильно заполнили и потом закрыли то при открытии это уже не будет отображаться
А вот тут не понял.
Можно чтобы сохранялось, можно чтобы очищалось. Есть такое понятие как ClearCache, Апекс давно уже написал функцию, которая чистит поля.
...
Рейтинг: 0 / 0
Доступ к атрибутам плагина из javascript
    #38881491
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blkangel,
+1
это веб. И тут трудно понять, что кому надо.
Некоторые ждут - "с чистого листа, т.к. не сохраняли".
...
Рейтинг: 0 / 0
Доступ к атрибутам плагина из javascript
    #38881493
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
указанный выше способ скорее для библиотеки, а не для конструктора.

Не уверен что понимаю задачу, но вообще я знаю 3 способа взаимодействия с плагинами:

1. через массив, допустим

Код: plsql
1.
render_result.javascript_function := 'init_validators("'||to_char(p_dynamic_action.id)||'")';



можно определить глобальную функцию, которая по входному параметру p_dynamic_action.id будет обращаться к значениям соответствующего экземпляра плагина

на примере функции say:

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
function say() { 
  
  if (!gObjArr)  var gObjArr = []; 
  var gObj = {}; 
  
  gObj.ActionId = 10; 
  gObj.ItemList = 'PX_MYITEM'; 
  
  gObjArr.push(gObj);  
  
  window.hello = function(pActionID) { 
  
    alert( gObjArr.filter( function(pObj) { return pObj.ActionId = pActionID } )[0].ItemList );
  };
  
  window.GetObj = function(pActionID) { 
  
    return gObjArr.filter( function(pObj) { return pObj.ActionId = pActionID } )[0];
  };
}

say();
hello(10);
alert( GetObj(10).ItemList );



Соответственно, обработчик hello по переданному ActionID реализует некоторый стандартный метод,
обработчик GetObj по переданному ActionID возвращает object, в котором хранятся данные плагина.

Тут вместо say будет init_validators (вызывается автоматически), вместо gObj скажем this.action, который дополнить значением ActionId и т.д.
ActionId при вызове hello можно взять из apex_dictionary

метод filter не работает в ie8, чтобы работало можно выполнить где-нибудь при инициализации что-нибудь вроде

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
if (!Array.prototype.filter)
{
  Array.prototype.filter = function(fun /*, thisp */)
  {
    "use strict";

    if (this === void 0 || this === null)
      throw new TypeError();

    var t = Object(this);
    var len = t.length >>> 0;
    if (typeof fun !== "function")
      throw new TypeError();

    var res = [];
    var thisp = arguments[1];
    for (var i = 0; i < len; i++)
    {
      if (i in t)
      {
        var val = t[i]; // in case fun mutates this
        if (fun.call(thisp, val, i, t))
          res.push(val);
      }
    }

    return res;
  };
}




2. второй способ - вместо массива использовать события, которые рассылать элементам, над которыми плагин производит действия, внутрь можно передать необходимые данные

т.е., например, добавляем в плагин событие myEvent
плагин производит действие с элементом (допустим с Items-ом PX_MYITEM), после чего рассылает это событие:

Код: javascript
1.
2.
3.
4.
5.
6.
var gObj = {}; 
  
gObj.ActionId = 10; 
gObj.ItemList = 'PX_MYITEM'; 

$("#PX_MYITEM").trigger("myEvent", gObj);



тогда можно создать Dynamic Action:

Event: myEvent
Selection Type: Jquery Selector
jQuery Selector: #PX_MYITEM

Внутри Action можно будет обратиться к данным плагина:

alert(this.data.ItemList);

3. Третий способ - добавить атрибут, куда можно вписать обработчик яваскрипт при создании самого плагина, тогда обработчику можно будет предоставить необходимый интерфейс, через который можно обратиться к свойствам и методам, типа this.data и др.

Но третий я бы не рекоммендовал делать в большинстве случаев.
...
Рейтинг: 0 / 0
Доступ к атрибутам плагина из javascript
    #38881537
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4. Можно еще создать глобальные методы с динамическими именами на основе p_dynamic_action.id, потом поизвращаться с функцией eval, или яваскрипт код генерировать динамически через pl/sql, но я не думаю, что это правильный подход, т.к. использование eval считается плохим тоном, точно так же как делать зависимым яваскрипт от pl/sql слишком сильно.

Впрочем он может иметь смысл с плагинами другого типа, когда плагин генерирует html на основе элементов с определенными именами, тогда плагин может догенерировать элементы с похожими именами, (например элемент имя item + приставка "_display" и т.д), но такой подход не подходит для данного вида плагина по архитектурным соображениям, имхо.
...
Рейтинг: 0 / 0
Доступ к атрибутам плагина из javascript
    #38881541
blkangel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SvDev,
Вариантов куча, и все это уже глубоко Явакскрипт.
И до сих пор непонятно, нужен ли ему такой отзывчивый функционал.

Как я понял, все сводиться к тому, что не дать пользователю нажать сохранить, пока он не заполнит поля.
В апексе это реализовано, что после нажатия кнопки "Сохранить", пользователю выдаются его косяки, и в большинстве всех это устраивает.
Автор же хочет, как я понял, поменять эту логику Апекса в корне, на все приложение... У каждого свои заморочки, ну вот он так хочет (хотя я считаю трудозатраты не оправданы).
Но автору пришла вот такая идея.
Мне любопытно, то в итоге получится. Возможно докрутим, и получится довольно юзабельно...
...
Рейтинг: 0 / 0
Доступ к атрибутам плагина из javascript
    #38881547
blkangel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SvDev4. Можно еще создать глобальные методы с динамическими именами на основе p_dynamic_action.id, потом поизвращаться с функцией eval, или яваскрипт код генерировать динамически через pl/sql, но я не думаю, что это правильный подход, т.к. использование eval считается плохим тоном, точно так же как делать зависимым яваскрипт от pl/sql слишком сильно.

Я ему предложил для динамических имен подход, правильный. Каждый новый объект в своем регионе будет иметь свое имя.
...
Рейтинг: 0 / 0
Доступ к атрибутам плагина из javascript
    #38881635
Diagnost89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На текущий момент остановился на следующем варианте:

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
/*
Блокировка поля ввода или кнопки
*/
function disable_input(id) {
    $('#'+id).prop('disabled', 'disabled');
}
/*
Разблокировка поля ввода или кнопки
*/
function enable_input(id) {
    $('#'+id).removeAttr('disabled');
}
/*
Сбросить для заданного итема цвета подписи и рамки на стандартные (для текущей темы оформления)
*/
function set_valid_colors(item_id) {
    $('label[for='+item_id+']>span,label[for='+item_id+']>a').css('color', '#444');
    $('#'+item_id).css('border', '1px solid rgb(170,170,170)');
}
/*
Выделить для заданного итема цвета подписи и рамки цветом ошибки (для текущей темы оформления)
*/
function set_error_colors(item_id) {
    $('label[for='+item_id+']>span,label[for='+item_id+']>a').css('color', '#b94a48');
    $('#'+item_id).css('border', '1px solid #b94a48');
}
/*
Проверка заданного итема на пустое значение
*/
function item_is_empty(item_id) {
    return $('#'+item_id).val() == '';
}
/*
Показать рядом с итемом сообщение об ошибке
*/
function show_tooltip(item_id, message) {
    var td = $('#'+item_id).parent('td');
    $(td).css('position', 'relative');
    $('<div class="tooltip-container"><span class="tooltip-message">'+message+'</span></div>').appendTo(td);
}
/*
Спрятать сообщение об ошибке для заданного итема
*/
function hide_tooltip(item_id) {
    var td = $('#'+item_id).parent('td');
    $(td).find('.tooltip-container').remove();
}
/*
Вот это и есть проблемная функция. Она предназначена для того чтобы сбросить на указанной форме
цвета подписей и рамки проверяемых инпутов на стандартные и спрятать все сообщения об ошибках.
Данная функция должна вызываться при открытии соответствующей формы.

В апексе данные формы сделаны обычными регионами, имеющими шаблон "Region without Buttons and Titles",
у которых прописан Static ID, а в атрибутах региона присутствует style="display:none;". В футере региона
присутствует вызов jQuery UI функции dialog:

$('#REGION_APP').dialog({
    autoOpen: false,
    resizable: false,
    modal: true,
    width: '800px',
    maxWidth: 800,
    open: function() {
        reset_interface($(this).get(0).id);
    }
});

В этом вызове и прописан вызов функции очистки интерфейса с передачей ей id региона.
Собственно если бы внутри этой функции можно было получить атрибуты соответствующего плагина
то было бы красиво. а сейчас происходит выборка элементов внутри этой формы с предопределенными
классами not_empty_item и not_empty_button
*/
function reset_interface(form_id) {
    var with_errors = false;
    var item_arr = $('#' + form_id + ' .not_empty_item');
    var input_arr = $('#' + form_id + ' .not_empty_button');
    for (var i in item_arr) {
// для каждого из итемов сбрасываем цвета
        set_valid_colors(item_arr.get(i).id);
// и прячем сообщения об ошибках
        hide_tooltip(item_arr.get(i).id);
// если хоть один из них пустой то надо будет заблочить все нужные кнопки
        if (item_is_empty(item_arr.get(i).id)) {
            with_errors = true;
        }
    }
// тут блокировка/разблокировка кнопок
    for (var i in input_arr) {
        if (with_errors)
            disable_input(input_arr.get(i).id);
        else
            enable_input(input_arr.get(i).id);
    }
}
/*
Это замыкание, которое возвращает функцию, привязывающую
к итему с id = item_id необходимые обработчики
*/
function validator(item_id, items, inputs) {
    return function() {
        $('#' + item_id).on('focus click', function() {
            hide_tooltip(item_id);
        });
        $('#' + item_id).on('input blur', function () {
            if (item_is_empty(item_id)) {
                set_error_colors(item_id);
                show_tooltip(item_id, 'Обязательное поле');
                for (var i in inputs) {
                    disable_input(inputs[i]);
                }
            } else {
                hide_tooltip(item_id);
                set_valid_colors(item_id);
                var with_errors = false;
                for (var j in items) {
                    if (item_is_empty(items[j])) {
                        with_errors = true;
                        break;
                    }
                }
                if (!with_errors) {
                }
                for (var k in inputs) {
                    if (with_errors) {
                        disable_input(inputs[k]);
                    } else {
                        enable_input(inputs[k]);
                    }
                }
            }
        });
    };
}
/*
Добавляет итему с id = item_id класс class_name
*/
function class_adder(item_id, class_name) {
    return function() {
        $('#' + item_id).addClass(class_name);
    }
}
/*
Точка входа. производит привязки к итемам обработчиков
и добавляет предопределенные классы итемам и кнопкам
*/
function set_validators() {

    var items = this.action.attribute01.split(',');
    var inputs = this.action.attribute02.split(',');

    for (var i in items) {
        var f = validator(items[i], items, inputs);
        f();
        var ca = class_adder(items[i], 'not_empty_item');
        ca();
    }
    for (var i in inputs) {
        var ca = class_adder(inputs[i], 'not_empty_button');
        ca();
    }
}



Вся проблема в том, насколько правильно и красиво реализована функция reset_interface ( form_id )
...
Рейтинг: 0 / 0
Доступ к атрибутам плагина из javascript
    #38881643
SvDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
с примером say я ошибся маленько:

gObjArr - глобальный, иначе, если say будет вызываться 2 раза из двух разных DA, они видеть друг друга не будут
соответственно, тогда обращаться можно будет и через массив тоже

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
function say(pId) { 
  
  if (!window.gObjArr)  window.gObjArr = []; 
  var gObj = {}; 
  
  gObj.ActionId = pId; 
  gObj.ItemList = 'PX_MYITEM' + pId; 
  
  gObjArr.push(gObj); 
  
  window.hello = function(pActionID) { 
  
    alert( gObjArr.filter( function(pObj) { return pObj.ActionId == pActionID } )[0].ItemList );
  };
  
  window.GetObj = function(pActionID) { 
  
    return gObjArr.filter( function(pObj) { return pObj.ActionId == pActionID } )[0];
  };
}

say(10);
say(20);
hello(20);
alert( GetObj(10).ItemList );

...
Рейтинг: 0 / 0
Доступ к атрибутам плагина из javascript
    #38881741
blkangel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Diagnost89В этом вызове и прописан вызов функции очистки интерфейса с передачей ей id региона.
Собственно если бы внутри этой функции можно было получить атрибуты соответствующего плагина
то было бы красиво. а сейчас происходит выборка элементов внутри этой формы с предопределенными
классами not_empty_item и not_empty_button

Опять 25, не функция в футуре РЕГИОНА у тебя должна вызываться, а функция из ПЛАГИНА, должна отработать по отношению к твоему региону. Ты плагин как массив для хранения используешь. Вот стучусь стучусь, а понимания нет. если ты плагин как массив используешь, выкинь на фик плагин. Если ты используешь плагин как плагин, будь добр, все обработки внутри него написать.
...
Рейтинг: 0 / 0
Доступ к атрибутам плагина из javascript
    #38881780
blkangel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Diagnost89,

Хорошо, давай так.
Вот этот скрипт, который у тебя основной в плагине, перенесем просто в футер региона? Можем так сделать?
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
function set_validators() {

    var items = this.action.attribute01.split(',');
    var inputs = this.action.attribute02.split(',');

    for (var i in items) {
        var f = validator(items[i], items, inputs);
        f();
        var ca = class_adder(items[i], 'not_empty_item');
        ca();
    }
    for (var i in inputs) {
        var ca = class_adder(inputs[i], 'not_empty_button');
        ca();
    }
}


Конечно, да! Нужен плагин? Конечно, НЕТ.
Весь остальной код, ты просто размешаешь в хеадере страницы. ВСЕЕЕЕ.
...
Рейтинг: 0 / 0
Доступ к атрибутам плагина из javascript
    #38883813
Diagnost89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

В общем в итоге сделал следующим образом.

1. Плагин типа "регион" для диалогового окна
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
function render (
    p_region              in apex_plugin.t_region,
    p_plugin              in apex_plugin.t_plugin,
    p_is_printer_friendly in boolean )
    return apex_plugin.t_region_render_result as
 begin
    htp.p('<script>$("#'||p_region.static_id||'").dialog({autoOpen: false,resizable: false,modal: true,width: "auto",maxWidth: 1200,open:function(){$.event.trigger("jquidialogopen");},	close: function(){$.event.trigger("jquidialogclose");}});</script>');
   return null;
 end;


У этого региона есть два события, сделанные как компоненты: OnOpen и OnClose

2. у плагина NotEmptyValidator теперь не два а три атрибута:
первый - список итемов для проверки
второй - список кнопок для лока/анлока
третий - тип действия (selectlist, имеет два значения - Init и Reset)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
function render (
    p_dynamic_action in apex_plugin.t_dynamic_action,
    p_plugin         in apex_plugin.t_plugin )
    return apex_plugin.t_dynamic_action_render_result is
l_render_result apex_plugin.t_dynamic_action_render_result;
begin
apex_javascript.add_library(
	p_name      => 'not_empty_validator',
	p_directory => p_plugin.file_prefix,
	p_version   => null
);
apex_css.add_file (
	p_name => 'tooltip',
	p_directory => p_plugin.file_prefix,
	p_version => null
);
l_render_result.attribute_01 := p_dynamic_action.attribute_01;
l_render_result.attribute_02 := p_dynamic_action.attribute_02;
if (p_dynamic_action.attribute_03 = 1) then
	l_render_result.javascript_function := 'set_validators';
else
	l_render_result.javascript_function := 'reset_validators';
end if;
return l_render_result;
end;



Соответственно в js-файле две точки входа в плагин:

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
function set_validators() {

    var items = this.action.attribute01.split(',');
    var inputs = this.action.attribute02.split(',');

    for (var i in items) {
        var f = validator(items[i], items, inputs);
        f();
    }
}

function reset_validators() {
    var with_errors = false;
    var items = this.action.attribute01.split(',');
    var inputs = this.action.attribute02.split(',');
    for (var i in item_arr) {
        set_valid_colors(items[i]);
        hide_tooltip(items[i]);
        if (item_is_empty(items[i])) {
            with_errors = true;
        }
    }
    for (var i in inputs) {
        if (with_errors)
            disable_input(inputs[i]);
        else
            enable_input(inputs[i]);
    }
}



3. На странице делается 2 динамик экшена
первый на Page Load вызывает плагин NotEmptyValidator c действием Init
второй на кастомном событии плагина региона OnOpen вызывает плагин NotEmptyValidator с действием Reset

Все управляется теперь декларативно, никаких js никуда дописывать не надо.
...
Рейтинг: 0 / 0
Доступ к атрибутам плагина из javascript
    #38883987
blkangel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Diagnost89,

Есть такое понятие, как "гавно-код". Тут у нас яркий пример "гавно-решение". Надеюсь, что это будет только в единственном экземпляре.
...
Рейтинг: 0 / 0
Доступ к атрибутам плагина из javascript
    #38884171
e.s.l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
blkangel ,
Просьба указать, чем конкретно у Вас лично это решение вызывает такую реакцию? Какая конкретно его часть?
Плагин выполняет свою основную функцию - делает проверку указанных полей на "заполненность" и в зависимости от этого меняет состояние указанных кнопок. Так же можно выполнить сброс валидации для указанных полей и кнопок. Все это делается без единой строчки js-кода со стороны пользователя. И к тому же, вопрос изначально был про то, как передать значение атрибута плагина в js-функцию. На данный момент видно, что атрибут передается в функцию в зависимости от выбранного типа действия (инициализация/сброс).

Касательно встроенного функционала валидации апекса - он происходит при сабмите формы. ТС хочет все обработки делать, не допуская перезагрузок страницы и это, как мне кажется, правильный подход.

ТС решил свою задачу.

Не надо пытаться самоутвердиться, уничижая достижения других.
...
Рейтинг: 0 / 0
Доступ к атрибутам плагина из javascript
    #38884190
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
e.s.l,
это публичный форум. Так что, критика - обычное дело.
Добро пожаловать в веб.
Тем более, что задачи плагина, описали только вы .... на 2-ой странице.
...
Рейтинг: 0 / 0
Доступ к атрибутам плагина из javascript
    #38884209
blkangel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
e.s.l blkangel ,
Просьба указать, чем конкретно у Вас лично это решение вызывает такую реакцию? Какая конкретно его часть?
Плагин выполняет свою основную функцию - делает проверку указанных полей на "заполненность" и в зависимости от этого меняет состояние указанных кнопок. Так же можно выполнить сброс валидации для указанных полей и кнопок. Все это делается без единой строчки js-кода со стороны пользователя. И к тому же, вопрос изначально был про то, как передать значение атрибута плагина в js-функцию. На данный момент видно, что атрибут передается в функцию в зависимости от выбранного типа действия (инициализация/сброс).

Касательно встроенного функционала валидации апекса - он происходит при сабмите формы. ТС хочет все обработки делать, не допуская перезагрузок страницы и это, как мне кажется, правильный подход.

ТС решил свою задачу.


Дорогой e.s.l , Вы видимо читали ветку не вникая в суть.
e.s.l,
Мде... Видимо вы выборочно ветку читали.
1. Человек к реализации конкретной задачи, подошел неверно. Не верно оценил трудозатраты, сложность решения, отоговый выхлоп.. Можно обойтись только JS кодом (который кстати уже написан, чутка доработав).
2. Теперь по самой реализации ОДНОЙ задачи. Для ее реализции, мы используем ДВА плагина + плюс вызовы из вне? Это только меня смущает? Или у нас тут много таких "супер" программеров?????? Давай те еще третий плагин напишем, который будет управлять первыми двумя? (Чего бы нам к велосипеду еще педали на для рук не сделать, может лучше поедет....) Где логика? Ну раз уж решили реализовать через плагин, будьте добры реализовать все в одном.

e.s.l Не надо пытаться самоутвердиться, уничижая достижения других.
Я предложил решение, но не обращая на это, автор, гнет свою линию, не обращая ни на советы ни на кого и выкладывать свое "произведение". Видимо, автор хочет услышать мнения другиз, о своем произведении. Вот он его и получил.
...
Рейтинг: 0 / 0
Доступ к атрибутам плагина из javascript
    #38884292
e.s.l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
blkangel1. Человек к реализации конкретной задачи, подошел неверно. Не верно оценил трудозатраты, сложность решения, отоговый выхлоп.. Можно обойтись только JS кодом (который кстати уже написан, чутка доработав).

Тут я бы не был так категоричен. Давайте по порядку.

Не вижу тут проблем с оценкой трудозатрат. Если у нас будет N страниц где будет M форм, по вашему нам нужно будет скопировать js-код N*M раз. Это бредовое предложение - копировать код из раза в раз.

В чем заключается сложность итогового решения? Тут не понятно.

Итоговый выхлоп тоже есть, и ощутимый. Теперь подключая плагины на страницу можно без написания дополнительного кода создавать динамические диалоговые окна и проводить валидацию, опять же, динамически.

blkangel2. Теперь по самой реализации ОДНОЙ задачи. Для ее реализции, мы используем ДВА плагина + плюс вызовы из вне? Это только меня смущает? Или у нас тут много таких "супер" программеров?????? Давай те еще третий плагин напишем, который будет управлять первыми двумя? (Чего бы нам к велосипеду еще педали на для рук не сделать, может лучше поедет....) Где логика? Ну раз уж решили реализовать через плагин, будьте добры реализовать все в одном.

Два плагина используются для реализации двух разных задач, как я понял. Один отвечает за отрисовку региона как модального окна jQuery UI Dialog (штатного региона такого типа в апексе нет). Это может быть использовано и без валидации полей. Второй плагин как раз выполняет валидацию полей и смену состояний кнопок (это может быть использовано и в регионе, который не является jQuery UI Dialog). Отсюда видно, что плагины не зависят друг от друга и выполняют совершенно разные задачи. ТС лишь спросил о том как эти плагины должны взаимодействовать, изначально пойдя не совсем по тому пути (вызов js-функции плагина за пределами контекста этого плагина). Теперь же эта проблема решена, на сколько я вижу.

А критика, как мне показалось, имела место быть лишь по тому, что ТС не использовал ни одно из предложенных решений. Но это его право. И критиковать его решение только потому что оно не использует предложенных Вами методов - вот это мне не понятно.
...
Рейтинг: 0 / 0
Доступ к атрибутам плагина из javascript
    #38884318
blkangel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
e.s.lпо вашему нам нужно будет скопировать js-код N*M раз. Это бредовое предложение - копировать код из раза в раз.

Не нужно ничего копировать, скрипт должен цепляться как библиотека везде. У которой входный параметры (listItems, buttonItems). В регионе одна строчка var myUniqueRegionObjectNazivajuKakHochu= new validators(listItems, buttonItems);
Часть аналогичного универсального блока у меня.
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
	//Проверка на доступность для редактирования ....., return 'YES' or 'NO'
	isWritebleEmr : function (emrRecId) {
		var getright = new htmldb_Get(null, $v('pFlowId'),'APPLICATION_PROCESS=IS_USER_PERIOD_WRITABLE',  0);
		getright.addParam('x01', emrRecId);
		gReturn = getright.get();
		getright = null;
		return gReturn;	
	},
	//Универсальная функция делает элемент(ы) readonly и подсвечивает backgroud silver, в зависимости от входных параметров
	readonlyElement : function (jSelector, ignoreSelector) {
		$(jSelector).not(ignoreSelector).attr("readonly","readonly");
		$(jSelector).not(ignoreSelector).css("background-color","silver");
	},
	//Уневерсальная функция делает элемент(ы) disable , в зависимости от входных параметров
	disableElement : function (jSelector, ignoreSelector) {
		$(jSelector).not(ignoreSelector).attr("disabled",true);
	},
	//Блокируем все на странице кроме кнопок
	readonlyElementAll : function (ignoreSelector) {
		var me=this;
		me.readonlyElement("input,textarea,select",ignoreSelector);
		//Чекбоксы блокируем
		$("input[type=checkbox]").prop("disabled",true);
		//$("button").not(ignoreSelector).prop("disabled",true);
		me.disableTree();
	},
	//Проверяем и блокируем элементы если страница не доступна пользователю и возвращаем 'YES' or 'NO' 
	readonlyEmrPageIfDenided : function (emrRecId, ignoreSelector) {
		var me=this;
		var vReturn=me.isWritebleEmr(emrRecId);
		//console.log("me.isWritebleEmr(emrRecId)="+vReturn);
		if (vReturn=="NO") {
			me.readonlyElementAll(ignoreSelector);
		}
		return vReturn;
	},
...
Рейтинг: 0 / 0
Доступ к атрибутам плагина из javascript
    #38884319
blkangel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
e.s.l,

И вообще, чего ты мне хочешь втюхать? Что у него супер пупер решение? Ну так используй молча. Меня не трогай.
...
Рейтинг: 0 / 0
Доступ к атрибутам плагина из javascript
    #38884349
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blkangel,
Очень интересный подход.
Мои 5 копеек:
Я ратую за максимальное использование таких вещей на этапе рендеринга.
Тогда вступают в действие штатные средства ороракле-apex.
Грань разумности 3х подходов тонкая))
...
Рейтинг: 0 / 0
Доступ к атрибутам плагина из javascript
    #38884642
e.s.l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
blkangelИ вообще, чего ты мне хочешь втюхать?
Ничего я тебе лично втюхать не хочу.

blkangelЧто у него супер пупер решение?
В отличие от твоего решения, у него все завернуто в плагин и имеет интерфейс. В остальном тоже самое с другими именами.

blkangelНу так используй молча.
Я не могу опубликовать свое мнение? Это позволено только тебе? Ну так заведи себе блог и пиши в него свои мнения, если не хочешь знать мнения других.

blkangelМеня не трогай.
Извини, что потревожил. Больше не буду. Откланиваюсь.
...
Рейтинг: 0 / 0
Доступ к атрибутам плагина из javascript
    #38884713
blkangel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
e.s.l,
Прошу прощения за грубость, но эту тему я обсуждать не хочу.
...
Рейтинг: 0 / 0
42 сообщений из 42, показаны все 2 страниц
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Доступ к атрибутам плагина из javascript
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]