2014-12-29 3 views
1

(Это может быть слишком локализованы вопрос, но я попытаюсь обобщить)Связанный сеттер не вызывается, если значение свойства не изменилось?

Вопрос: Если свойство setter отмечен как Bindable, это будет не дозвонились, если новое значение такое же, как старое значение?

Я вижу вышеуказанное поведение в унаследованном проекте, который унаследовал: сеттер не вызван. Если я не объявляю установщик как Bindable, тогда сеттер вызывается независимо от нового значения.

Может ли кто-нибудь подтвердить, что вышесказанное является способом, с помощью которого вещи предназначены для работы с привязкой?

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

Свойство связано:

[Bindable] 
    protected var _source:AolMediaFile; 

сеттер обязан:

[Bindable] 
    public function set source(file:AolMediaFile):void{ 
      _source = file; 
     // do some stuff with file 
    } 

ответ

1

Так копаться здесь немного больше я наткнулся на этот вопрос: Flex: Help me understand data Binding on getters and setters который описывает код генерируется путем объявления сеттера или геттера Bindable

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

public function set name(value:String) 
{ 
    if (_name == value) 
     return; 
    _name = value; 
    dispatchEvent(new Event("nameChanged")); 
} 

+0

Я думаю, что вы неправильно прочитали сообщение. @Sunil D. опубликовал это как свой собственный код. Он упоминает, что можно предотвратить генерирование автоматически генерируемого кода, указав имя события в теге. Таким образом, вы можете предоставить свою собственную функцию setter, которая не включает проверку, изменится ли значение. Но имейте в виду, что без проверки круговой вызов сеттеров вызовет проблемы. У меня нет опыта работы с flex, я просто прочитал его ответ. – null

1

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

<your:Component source="{any.source.aolMediaFile}" /> 

Только когда any, source и aolMediaFile объявлены [Bindable], source будет вызван. Наличие source объявлено как [Bindable] свойства только интересно, если второй компонент будет в зависимости от состояния вашего компонента

<your:Component id="yourComponent" source="{any.source.aolMediaFile}" /> 
<s:TextField text="{yourComponent.source}" /> 

Если вы хотите привязать к свойству AolMediaFile, то класс или специфическое свойство должно быть также [Bindable].

Обычно компилятор выводит предупреждения, если привязок не могут быть сгенерированы:

предупреждение: не в силах связать собственности «источник» на классе «Object» (класс не является IEventDispatcher)

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

+0

Вот почему внедрение сеттеров вручную всегда ценнее, чем просто генерация кода, так как вы можете отлаживать каждый отдельный шаг. Рад, что вы нашли источник проблемы. –

Смежные вопросы