FormFlow DefineAsyncDelegate вызывается несколько раз

При определении динамических кнопок в FormFlow кажется, что функция Define вызывается несколько раз (один раз после запроса каждого поля).

Функция определения выполняет тяжелые команды, которых мы хотели бы избежать, когда они не нужны. Эти команды используются для расчета значений динамических кнопок. Есть ли способ избежать многократного выполнения функции определения? Например, только после того, как определенные поля были заполнены пользователем? Есть ли способ узнать, когда определенные поля заполнены?

public static IForm<BoardForm> BuildForm()
    {
        return new FormBuilder<BoardForm>()
            .Field(new FieldReflector<BoardForm>(nameof(ExistingAccountName))
                .SetType(null)
                .SetActive(IsExistingClusterChosen)
//This is a heavy function which is called multiple times
                .SetDefine(DefineExistingAccountName))
.Build();
    }

Спасибо за помощь!


person Ravit D    schedule 26.03.2017    source источник


Ответы (1)


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

private IForm<BoardForm> BuildOrderForm()
{
    var isSetDefineExecuted = false;

    return new FormBuilder<BoardForm>()
        .Field(new FieldReflector<BoardForm>(nameof(ExistingAccountName))
        .SetType(null)
        .SetActive(IsExistingClusterChosen)
            .SetDefine(async (state, field) =>
            {
                if (isSetDefineExecuted)
                {
                    return true;
                }

                isSetDefineExecuted = true;

                // Your code
            }))
        .Build();
}

Флаг isSetDefineExecuted предотвращает любое дополнительное выполнение после первого. Он возвращает true, чтобы указать на «успешное» выполнение, так как возврат false приведет к бесконечному циклу вызовов.

person markolazic88    schedule 11.01.2018