Регистрация  |  Вход

Свойства и их использование в Visualforce

Всем привет, буду благодарен тому кто объяснит следующее поведение (а вначале угадает его, гг).

В общем возникла такая проблема, по шагам:

1. Создал обертку, допустим MyWrapper

class MyWrapper {
public Object__c myObject {get;set;}
}


2. В контроллере есть такой метод

public MyWrapper wrapper {get;set;}

public void refreshMyObject() {
// Field1__c - picklist
// Field2__c - text
if (wrapper.myObject.Field1__c == CONCRETE_VALUE) {
wrapper.myObject.Field2__c = null;
}
}

3. В VF странице примерно такое

<apex:inputField value="{!wrapper.myObject.Field1__c}">
<apex:actionSupport event="onchange" action="{!refreshMyObject}" rerender="myPanel"/>
</apex:inputField>
<apex:outputPanel layout="none" rendered="{!wrapper.myObject.Field1__c == CONCRETE_VALUE}">
<apex:inputField value="{!wrapper.myObject.Field2__c}"/>
</apex:outputPanel>

4. Угадайте какое будет поведение при

  • выберем для Field1__c значение CONCRETE_VALUE
  • после этого изменим
  • (т.к. инпут отрендерится) значение Field2__c
  • выберем для Field1__c значение отличное CONCRETE_VALUE
  • обратно выберем для Field1__c значение CONCRETE_VALUE

5. Это поведение я исправил (скорее всего костылём) Хотел бы услышать ваши мнения.

Всем привет, буду благодарен тому кто объяснит следующее поведение (а вначале угадает его, гг).

В общем возникла такая проблема, по шагам:

1. Создал обертку, допустим MyWrapper

[code]class MyWrapper {
    public Object__c myObject {get;set;}
}
[/code]


2. В контроллере есть такой метод

[code]public MyWrapper wrapper {get;set;}

public void refreshMyObject() {
    // Field1__c - picklist
    // Field2__c - text
    if (wrapper.myObject.Field1__c == CONCRETE_VALUE) {
        wrapper.myObject.Field2__c = null;
    }
}[/code]

3. В VF странице примерно такое
[code]<apex:inputField value="{!wrapper.myObject.Field1__c}">
    <apex:actionSupport event="onchange" action="{!refreshMyObject}" rerender="myPanel"/>
</apex:inputField>
<apex:outputPanel layout="none" rendered="{!wrapper.myObject.Field1__c == CONCRETE_VALUE}">        
    <apex:inputField value="{!wrapper.myObject.Field2__c}"/>
</apex:outputPanel>[/code]

4. Угадайте какое будет поведение при 
[list][*] выберем для Field1__c значение CONCRETE_VALUE
[*] после этого изменим (т.к. инпут отрендерится) значение Field2__c
[*] выберем для Field1__c значение отличное CONCRETE_VALUE
[*] обратно выберем для Field1__c значение CONCRETE_VALUE
[/list]

5. Это поведение я исправил (скорее всего костылём) :) Хотел бы услышать ваши мнения.

RasMisha
Всем привет, буду благодарен тому кто объяснит следующее поведение (а вначале угадает его, гг).

В общем возникла такая проблема, по шагам:

1. Создал обертку, допустим MyWrapper

class MyWrapper {
public Object__c myObject {get;set;}
}
2. В контроллере есть такой метод

public MyWrapper wrapper {get;set;}

public void refreshMyObject() {
// Field1__c - picklist
// Field2__c - text
if (wrapper.myObject.Field1__c == CONCRETE_VALUE) {
wrapper.myObject.Field2__c = null;
}
}
3. В VF странице примерно такое

<apex:inputField value="{!wrapper.myObject.Field1__c}">
<apex:actionSupport event="onchange" action="{!refreshMyObject}" rerender="myPanel"/>
</apex:inputField>
<apex:outputPanel layout="none" rendered="{!wrapper.myObject.Field1__c == CONCRETE_VALUE}">
<apex:inputField value="{!wrapper.myObject.Field2__c}"/>
</apex:outputPanel>
4. Угадайте какое будет поведение при

выберем для Field1__c значение CONCRETE_VALUE
после этого изменим
(т.к. инпут отрендерится) значение Field2__c
выберем для Field1__c значение отличное CONCRETE_VALUE
обратно выберем для Field1__c значение CONCRETE_VALUE
5. Это поведение я исправил (скорее всего костылём) Хотел бы услышать ваши мнения.

А что должно произойдти, поидее все нормально. Костиль уже не добавлен в код?

[quote="RasMisha"]Всем привет, буду благодарен тому кто объяснит следующее поведение (а вначале угадает его, гг).

В общем возникла такая проблема, по шагам:

1. Создал обертку, допустим MyWrapper

class MyWrapper {
    public Object__c myObject {get;set;}
}
2. В контроллере есть такой метод

public MyWrapper wrapper {get;set;}

public void refreshMyObject() {
    // Field1__c - picklist
    // Field2__c - text
    if (wrapper.myObject.Field1__c == CONCRETE_VALUE) {
        wrapper.myObject.Field2__c = null;
    }
}
3. В VF странице примерно такое 

<apex:inputField value="{!wrapper.myObject.Field1__c}">
    <apex:actionSupport event="onchange" action="{!refreshMyObject}" rerender="myPanel"/>
</apex:inputField>
<apex:outputPanel layout="none" rendered="{!wrapper.myObject.Field1__c == CONCRETE_VALUE}">        
    <apex:inputField value="{!wrapper.myObject.Field2__c}"/>
</apex:outputPanel>
4. Угадайте какое будет поведение при 

выберем для Field1__c значение CONCRETE_VALUE 
после этого изменим
(т.к. инпут отрендерится) значение Field2__c 
выберем для Field1__c значение отличное CONCRETE_VALUE 
обратно выберем для Field1__c значение CONCRETE_VALUE 
5. Это поведение я исправил (скорее всего костылём)  Хотел бы услышать ваши мнения.[/quote]

А что должно произойдти, поидее все нормально. Костиль уже не добавлен в код?

Alex Tsitsura
А что должно произойдти, поидее все нормально. Костиль уже не добавлен в код?

Ну я думал кто-то догадается сам.
В общем проблема: Field2__c после обнуления возвращает своё значение.
"Костыля" в данном коде нет(!).

[quote="Alex Tsitsura"]А что должно произойдти, поидее все нормально. Костиль уже не добавлен в код?[/quote]
Ну я думал кто-то догадается сам.
В общем проблема: Field2__c после обнуления возвращает своё значение.
"Костыля" в данном коде нет(!). 

RasMisha
wrapper.myObject.Field2__c = null;

Тоисть в Field2__c осталось значение, которое было указано до этого? Если да, то тагово по идее не должно быть.

[quote="RasMisha"]wrapper.myObject.Field2__c = null; [/quote]
Тоисть в Field2__c осталось значение, которое было указано до этого? Если да, то тагово по идее не должно быть.

RasMisha, с удовольствием пообщался с тобой на счет этого примера, но голова настолько забита текущей задачей, что просто не осилил даже.
Но я заметил эту проблему своего мозга уже давно
Если мне реально не надо разобраться с чем-то по работе код мне кажется вообще неподъемным.
Сколько раз на форуме выкладывали код и кажется что задача жопа, но буквально через пару дней сталкиваешься с такой проблемой и все оказывается простым если включить мозги.

Короче я сюда захожу когда хочу немного отключить мозг
Так что переживаю по существу твоего вопроса, но в этом состоянии я хуже студента

RasMisha, с удовольствием пообщался с тобой на счет этого примера, но голова настолько забита текущей задачей, что просто не осилил даже.
Но я заметил эту проблему своего мозга уже давно :(
Если мне реально не надо разобраться с чем-то по работе код мне кажется вообще неподъемным.
Сколько раз на форуме выкладывали код и кажется что задача жопа, но буквально через пару дней сталкиваешься с такой проблемой и все оказывается простым если включить мозги.

Короче я сюда захожу когда хочу немного отключить мозг :D 
Так что переживаю по существу твоего вопроса, но в этом состоянии я хуже студента :D 

Alex Tsitsura
RasMisha
wrapper.myObject.Field2__c = null;

Тоисть в Field2__c осталось значение, которое было указано до этого? Если да, то тагово по идее не должно быть.

Да, возвращается значение которое я ввел на шаге 4.2

[quote="Alex Tsitsura"][quote="RasMisha"]wrapper.myObject.Field2__c = null; [/quote]
Тоисть в Field2__c осталось значение, которое было указано до этого? Если да, то тагово по идее не должно быть.[/quote]
Да, возвращается значение которое я ввел на шаге 4.2

Dmitry Shnyrev
Так что переживаю по существу твоего вопроса, но в этом состоянии я хуже студента

Я решил эту проблему, НО как я её решил мне не нравится.
Не хочу говорить как, вдруг кто предложит лучший вариант (то что мой вариант предложат я вообще сомневаюсь, кроме может одного человека, которому я написал в скайп обратить внимание на то что я добавил )

[quote="Dmitry Shnyrev"]Так что переживаю по существу твоего вопроса, но в этом состоянии я хуже студента [/quote]
Я решил эту проблему, НО как я её решил мне не нравится.
Не хочу говорить как, вдруг кто предложит лучший вариант (то что мой вариант предложат я вообще сомневаюсь, кроме может одного человека, которому я написал в скайп обратить внимание на то что я добавил :) )

Ни у кого нет мыслей что ли?

Ни у кого нет мыслей что ли? 

У меня не получилось отрепродюсить, поле равно null после шага 4.4

У меня не получилось отрепродюсить, поле равно null после шага 4.4

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

1. MyWrapper

public class MyWrapper {

public MyObject__c myObject {get;set;}

public void AddObject(MyObject__c newObject) {
myObject = newObject;
}
}

2.MyController

public  class MyController {

public MyWrapper wrapper {get;set;}

public MyController() {
wrapper = new MyWrapper();
addMyObject();
}

public void addMyObject() {
wrapper.AddObject(new MyObject__c());
}

public void refreshMyObject() {
if (wrapper.myObject.Field1__c != 'Yes') {
wrapper.myObject.Field2__c = null;
}
}
}

3. MyPage

<apex:page showHeader="true" sidebar="true" controller="MyController">

<apex:form>
<apex:outputPanel layout="Block" id="myPanel">
<apex:inputField value="{!wrapper.myObject.Field1__c}">
<apex:actionSupport event="onchange" action="{!refreshMyObject}" reRender="myPanel"/>
</apex:inputField>
<apex:outputPanel layout="none" rendered="{!wrapper.myObject.Field1__C == 'Yes'}">
<apex:inputField value="{!wrapper.myObject.Field2__c}"/>
</apex:outputPanel>
</apex:outputPanel>
</apex:form>
</apex:page>

4. MyObject__c состоит из 2х полей
Field1__c - пиклист с 2мя значениями Yes/No
Field2__c - текст

ps Если что могу сделать видео :)

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

1. MyWrapper

[code]public class MyWrapper {
	
	public MyObject__c myObject {get;set;}

	public void AddObject(MyObject__c newObject) {
		myObject = newObject;
	}
}[/code]

2.MyController

[code]public  class MyController {

	public MyWrapper wrapper {get;set;}

	public MyController() {
		wrapper = new MyWrapper();
		addMyObject();
	}

	public void addMyObject() {
		wrapper.AddObject(new MyObject__c());
	}

	public void refreshMyObject() {
		if (wrapper.myObject.Field1__c != 'Yes') {
			wrapper.myObject.Field2__c = null;
		}
	}
}[/code]

3. MyPage

[code]<apex:page showHeader="true" sidebar="true" controller="MyController">

	<apex:form>
		<apex:outputPanel layout="Block" id="myPanel">
			<apex:inputField value="{!wrapper.myObject.Field1__c}">
				<apex:actionSupport event="onchange" action="{!refreshMyObject}" reRender="myPanel"/>
			</apex:inputField>
			<apex:outputPanel layout="none" rendered="{!wrapper.myObject.Field1__C == 'Yes'}">
				<apex:inputField value="{!wrapper.myObject.Field2__c}"/>
			</apex:outputPanel>
		</apex:outputPanel>
	</apex:form>
</apex:page>[/code]

4. MyObject__c состоит из 2х полей
  Field1__c - пиклист с 2мя значениями  Yes/No
  Field2__c - текст

ps Если что могу сделать видео :)

Ну ладно, в общем тогда моё решение и через что я до него дошел.

Сначале я попробовал заменить wrapper.myObject на <apex:variable .../> и дальше пользоваться переменной.
Результат тот же.

Следующим шагом я заменил

public MyWrapper wrapper {get;set;}

на массив (который по логике мог содержать только один элемент)

public MyWrapper[] wrapper {get;set;}

В итоге через <apex:repeat var="..." value="wrapper.myObject"/> это поведение изменилось на нужное мне.

Ну ладно, в общем тогда моё решение и через что я до него дошел.

Сначале я попробовал заменить wrapper.myObject на <apex:variable .../>  и дальше пользоваться переменной.
Результат тот же.

Следующим шагом я заменил 
[code]public MyWrapper wrapper {get;set;}[/code]

на массив (который по логике мог содержать только один элемент)
[code]public MyWrapper[] wrapper {get;set;}[/code]

В итоге через <apex:repeat var="..." value="wrapper.myObject"/> это поведение изменилось на нужное мне.
По ходу все бессильны :)
http://salesforce.stackexchange.com/questions/71785/please-help-explain-this-behavior

Пятниццо

Пятниццо :D 

Может ты на какой косяк salesforce наткнулся?
Здесь есть отдельная тема (длиииииная) по косякам от salesforce

Может ты на какой косяк salesforce наткнулся?
Здесь есть отдельная тема (длиииииная) по косякам от salesforce
https://salesforce-developer.ru/forum/topic-kosyaki-salesforce-o-kotoryh-vy-vozmozhno-ne-znaete

Просто думал кому интересно поковыряться Мало ли какие еще "грязные" дела могут сделать свойства в ваших проектах.
Но, видимо, не очень интересно :)

Просто думал кому интересно поковыряться :) Мало ли какие еще "грязные" дела могут сделать свойства в ваших проектах.
Но, видимо, не очень интересно :)

RasMisha
Просто думал кому интересно поковыряться Мало ли какие еще "грязные" дела могут сделать свойства в ваших проектах.
Но, видимо, не очень интересно :)

Интересно. Я просто почти 2 дня мудохался с компонентами и формами.

[quote="RasMisha"]Просто думал кому интересно поковыряться :) Мало ли какие еще "грязные" дела могут сделать свойства в ваших проектах.
Но, видимо, не очень интересно :)[/quote]

Интересно. Я просто почти 2 дня мудохался с компонентами и формами.

А я до сих пор (22.00 пятница) мудохаюсь с задачей сдедать супер дупер библиотеку медиа на js (как на wordpress), интегрировать ее с salesforce, WYSIWYG редактором и s3

А я до сих пор (22.00 пятница) мудохаюсь с задачей сдедать супер дупер библиотеку медиа на js (как на wordpress), интегрировать ее с salesforce, WYSIWYG редактором и s3 :D 

Dmitry Shnyrev
А я до сих пор (22.00 пятница) мудохаюсь с задачей сдедать супер дупер библиотеку медиа на js (как на wordpress), интегрировать ее с salesforce, WYSIWYG редактором и s3 :D

Ну и как успехи?

[quote="Dmitry Shnyrev"]А я до сих пор (22.00 пятница) мудохаюсь с задачей сдедать супер дупер библиотеку медиа на js (как на wordpress), интегрировать ее с salesforce, WYSIWYG редактором и s3 :D[/quote]
Ну и как успехи?

буду еще писать не один вечер

:D буду еще писать не один вечер