Я пытаюсь создать настраиваемый bindHandler, который я могу использовать для создания поведения водяных знаков для полей ввода текста.текстовый ввод водяного знака с использованием пользовательского связыванияHandler
По watermark
я имею в виду: добавить значения по умолчанию для текстовых полей, которые удаляются в центре внимания, и заменены на размытие, если текстовое поле еще пуст
мне удалось получить эту работу, как показано в этом jsfiddle : http://jsfiddle.net/rpallas/nvxuw/
у меня есть 3 вопроса по поводу этого решения:
- есть ли способ изменить его так, что я только должен объявить значение водяного знака один раз? В настоящее время я должен поставить его на место, где я объявляю привязку, и мне также нужно инициализировать наблюдаемое с тем же значением в viewModel, поскольку в противном случае оно не будет иметь начального значения.
- Есть ли лучший способ добраться до лежащего ниже наблюдаемого, к которому привязано значение элементов. Я сейчас хватаю его, используя allBindingsAccessor, но это мне не нравится. Первоначально я просто установил значение, используя jquery
$(element).val('')
, но это также не так. Что лучше, или есть лучший способ? - Есть ли у кого-нибудь или существуют существующие решения этой проблемы? Я заново изобретаю колесо?
Да, это почти то, что у меня было до того, как я изменил его, чтобы использовать allBindingsAccessor. При попытке установить начальное значение мне не хватало 'setTimeout'. Не могли бы вы кратко объяснить, почему это требуется? Кроме того, знаете ли вы, есть ли лучший способ? или вы думаете, что это хороший (достаточно) способ (с точки зрения всего решения)? Например, я замечаю, что есть привязка hasfocus (встроенная). Может быть, это лучший подход? – Robbie
Я думаю, что этот подход подходит, если вы хотите поддерживать старые браузеры. Для новых просто используйте атрибут placeholder. SetTimeout необходим, потому что внутри KO использует setTimeout перед установкой значения ввода. Это означает, что ваш код работал до того, как код KO установил значение, поэтому вам нужно, чтобы setTimeout снова удостоверился, что ваш код пришел последним в выполнении. – madcapnmckay
Большое спасибо за объяснение и помощь. – Robbie