Flex: существует безболезненная программная привязка данных?

PROCESSOR_ARCHITECTURE=x86

Появится на Win32, а для Win64 появится

PROCESSOR_ARCHITECTURE=AMD64

.

Если вы извращаете 32-битный cmd.exe процесс, то Windows представляет две переменные среды:

PROCESSOR_ARCHITECTURE=x86
PROCESSOR_ARCHITEW6432=AMD64
13
задан Theo 30 August 2008 в 16:51
поделиться

3 ответа

Не бойтесь MXML. Это является большим для разметки представлений. Если Вы пишете свое собственное допускающий повторное использование , компоненты, затем пишущий им в ActionScript могут иногда давать Вам, немного больше управления, но для представлений одноразового использования MXML намного лучше. Это более кратко, привязка extemely легкий настроить, и т.д.

Однако, привязка в чистом ActionScript не должна быть так большой частью боли. Это никогда не будет столь же просто как в MXML, где много вещей сделано для Вас, но это может быть сделано с не слишком много усилия.

то, Что Вы имеете, BindingUtils, и это - методы bindSetter и bindProperty. Я почти всегда использую первого, так как я обычно хочу сделать некоторую работу или вызов invalidateProperties, когда значения изменяются, я почти никогда просто не хочу установить свойство.

то, Что необходимо знать, - то, что эти два возвращают объект типа ChangeWatcher, если Вы хотите удалить привязку по некоторым причинам, необходимо держаться за этот объект. Это - то, что делает ручную привязку в ActionScript немного менее удобной, чем те в MXML.

Позволяют нам запуститься с простого примера:

BindingUtils.bindSetter(nameChanged, selectedEmployee, "name");

Это настраивает привязку, которая назовет метод nameChanged когда name свойство на объекте в переменной selectedEmployee изменения. nameChanged метод получит новое значение name свойство как аргумент, таким образом, это должно будет быть похожим на это:

private function nameChanged( newName : String ) : void 

проблема с этим простым примером состоит в том, что, как только Вы настроили эту привязку его, запустит каждый раз свойство указанных объектных изменений. Значение переменной selectedEmployee может измениться, но привязка все еще настраивается для объекта, на который переменная указала прежде.

существует два способа решить это: любой для хранения эти ChangeWatcher возвращенным [1 116] вокруг и вызов unwatch на нем, когда Вы хотите удалить привязку (и затем установка новая привязка вместо этого) или связать с собой. Я покажу Вам вариант преимущественной покупки сначала, и затем объясню, что я подразумеваю под привязкой к себе.

Эти currentEmployee мог быть превращен в пару метода get/метода set и реализован как это (только показ метода set):

public function set currentEmployee( employee : Employee ) : void {
    if ( _currentEmployee != employee ) {
        if ( _currentEmployee != null ) {
            currentEmployeeNameCW.unwatch();
        }

        _currentEmployee = employee;

        if ( _currentEmployee != null ) {
            currentEmployeeNameCW = BindingUtils.bindSetter(currentEmployeeNameChanged, _currentEmployee, "name");
        }
    }
}

то, Что происходит, - то, что, когда currentEmployee свойство установлено, оно надеется видеть, было ли предыдущее значение, и раз так удаляет привязку для того объекта (currentEmployeeNameCW.unwatch()), то оно устанавливает частную переменную, и если новое значение не было null, настраивает новую привязку для name свойство. Самое главное это сохраняет эти ChangeWatcher возвращенный обязательным вызовом.

Это - основной обязательный шаблон, и я думаю, что он хорошо работает. Существует, однако, прием, который может использоваться для создания его немного более простым. Можно связать с собой вместо этого. Вместо того, чтобы настроить и удалить привязку каждый раз currentEmployee изменения свойства у Вас может быть обязательная система, делают это для Вас. В Вашем creationComplete обработчик (или конструктор или по крайней мере некоторое время рано) можно настроить привязку как так:

BindingUtils.bindSetter(currentEmployeeNameChanged, this, ["currentEmployee", "name"]);

Это настраивает привязку не только к currentEmployee свойство на [1 127], но также и к name свойство на этом объекте. Таким образом, в любое время любой изменения метод currentEmployeeNameChanged назовут. Нет никакой потребности сохранить ChangeWatcher, потому что привязка никогда не должна будет удаляться.

второе решение работает во многих случаях, но я нашел, что первый иногда необходим, особенно при работе с привязкой в классах непредставления (так как this должен быть диспетчер события, и эти currentEmployee должно быть связываемым для него для работы).

29
ответ дан Theo 30 August 2008 в 16:51
поделиться
  • 1
    Существует маленькая опечатка. это на самом деле: выполнение (общественность * com.mycompany.myservice. MyService +.* (..)), Но это работает как очарование. Большое спасибо!!! – Sean Patrick Floyd 17 May 2010 в 12:08

Один способ разделить MXML и ActionScript для компонента в отдельные файлы путем выполнения чего-то подобного ASP.NET 1.x код позади модели. В этой модели декларативная часть (MXML в этом случае) является подклассом обязательной части (ActionScript). Таким образом, я мог бы объявить код позади для класса как это:

package CustomComponents
{
    import mx.containers.*;
    import mx.controls.*;
    import flash.events.Event;

    public class MyCanvasCode extends Canvas
    {
        public var myLabel : Label;

        protected function onInitialize(event : Event):void
        {
            MyLabel.text = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit.";
        }
    }
}

... и разметка как это:

<?xml version="1.0" encoding="utf-8"?>
<MyCanvasCode xmlns="CustomComponents.*" 
    xmlns:mx="http://www.adobe.com/2006/mxml"
    initialize="onInitialize(event)">
    <mx:Label id="myLabel"/>    
</MyCanvasCode>

, Как Вы видите от этого примера, disadvatage этого подхода - то, что необходимо объявить средства управления как myLabel в обоих файлах.

2
ответ дан Nick Higgs 30 August 2008 в 16:51
поделиться
  • 1
    Я понял намного позже, что это не совсем корректно (хотя это - вероятно, лучший выбор существует). Я хотел, чтобы аннотация была на сервисном методе интерфейса, но это только работает, если аннотация находится на методе реализации. И так как мне также нужно это поведение: stackoverflow.com/questions/3100228/… , я должен сохранить pointcut минимальное и проверить, что proceedingjoinpoint возражают мне. – Sean Patrick Floyd 1 July 2010 в 08:29

существует способ, которым я обычно использую для использования mxml и сценария действия вместе: Все мои компоненты MXML наследовались классу сценария действия, где я добавляю более сложный код. Затем можно обратиться к слушателям события, реализованным в этом классе в mxml файле.

С уважением,

Ruth

0
ответ дан 31 August 2008 в 03:51
поделиться
  • 1
    это хорошо работает: выполнение (общественность * com.mycompany.myservice.* +.* (..)) – Sean Patrick Floyd 18 May 2010 в 19:50
Другие вопросы по тегам:

Похожие вопросы: