Kotlin Использовать внешние переменные [duplicate]

По состоянию на WTForms 2.2 атрибут HTML required отображается, когда в поле есть валидатор, который устанавливает флаг "required" , Это позволяет клиенту выполнять некоторые основные проверки, сохраняя обратную связь с сервером.

Вы должны оставить его в браузере, чтобы справиться с этим. Эти сообщения являются стандартными и настраиваются для локали пользователя компьютера. Для управления этими сообщениями существует JavaScript API (см. Переполнение стека и MDN ), хотя WTForms не обеспечивает никакой интеграции с ним (но хорошая идея для расширения ).

Если вы действительно хотите отключить это, вы можете передать required=False при рендеринге поля.

{{ form.name(required=False) }}

Вы можете отключить его для целую форму вместо переопределения Meta.render_field.

class NoRequiredForm(Form):
    class Meta:
        def render_field(self, field, render_kw):
            render_kw.setdefault('required', False)
            return super().render_field(field, render_kw)

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

class UserForm(NoRequiredForm):
    ...

Вы также можете отключите проверку клиента, не изменяя столько кода, установив атрибут novalidate в тег HTML form.

См. обсуждение запроса на перенос добавив это поведение.

14
задан GeneralOfTheFelixLegions 7 April 2016 в 13:01
поделиться

2 ответа

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

Существует несколько способов:

  • Используйте выражение object , которое позволяет ссылаться на this объявленного объекта:
    private var runnable: Runnable = object : Runnable {
        override fun run() {
            /* Do something very important */
            handler.postDelayed(this, 5000)
        }
    }
    
    Это хорошо работает
  • Используйте lateinit var или делегированное свойство с Delegates.notNull(). ] :
    private lateinit var runnable: Runnable
    init {
        runnable = Runnable { 
            /* Do something very important */
            handler.postDelayed(runnable, 5000)
        }
    }
    
    Тот же инициализатор будет работать с этим объявлением:
    private var runnable: Runnable by Delegates.notNull()
    
  • Внедрить и использовать саморегуляцию для инициализаторов самостоятельно:
    class SelfReference<T>(val initializer: SelfReference<T>.() -> T) {
        val self: T by lazy {
            inner ?: throw IllegalStateException("Do not use `self` until initialized.")
        }
    
        private val inner = initializer()
    }
    
    fun <T> selfReference(initializer: SelfReference<T>.() -> T): T {
        return SelfReference(initializer).self
    }
    
    И тогда вы можете написать что-то вроде
    private var runnable: Runnable = selfReference { 
        Runnable {
            /* Do something very important */
            handler.postDelayed(self, 5000)
        } 
    }
    
15
ответ дан Community 27 August 2018 в 23:28
поделиться

Вы также можете использовать

private var runnable: Runnable = Runnable {
    /* Do something very important */
    handler.postDelayed(runnable(), 5000)
}

private fun runnable() = runnable
1
ответ дан tango24 27 August 2018 в 23:28
поделиться
Другие вопросы по тегам:

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