Estou tentando usar o KnockoutJS com a interface do jQuery. Eu tenho um elemento de entrada com um datepicker anexado. Atualmente, estou em execução knockout.debug.1.2.1.js
e parece que o evento de mudança nunca está sendo capturado pelo Knockout. O elemento fica assim:
<input type="text" class="date" data-bind="value: RedemptionExpiration"/>
Eu até tentei alterar o valueUpdate
tipo de evento, mas sem sucesso. Parece que o Chrome causa um focus
evento antes de alterar o valor, mas o IE não.
Existe algum método Knockout que "religue todas as ligações"? Tecnicamente, só preciso que o valor seja alterado antes de enviá-lo de volta ao servidor. Para que eu pudesse viver com esse tipo de solução alternativa.
Eu acho que o problema é culpa do datepicker, mas não consigo descobrir como consertar isso.
Alguma ideia?
fonte
Aqui está uma versão da resposta do RP Niemeyer que funcionará com os scripts de validação de knockout encontrados aqui: http://github.com/ericmbarnard/Knockout-Validation
As mudanças são feitas no manipulador de eventos de mudança para passar o valor digitado e não a data para os scripts de validação primeiro, configurando apenas a data para o observável, se for válido. Também adicionei o validationCore.init necessário para ligações personalizadas discutidas aqui:
http://github.com/ericmbarnard/Knockout-Validation/issues/69
Eu também adicionei a sugestão de rpenrose para um borrão na mudança para eliminar alguns cenários desagradáveis do datepicker atrapalhando as coisas.
fonte
Eu usei uma abordagem diferente. Como o knockout.js não parece acionar o evento com alterações, forcei o datepicker a chamar change () para sua entrada depois de fechada.
fonte
Embora todas essas respostas tenham me poupado muito trabalho, nenhuma delas funcionou totalmente para mim. Após selecionar uma data, o valor vinculado não será atualizado. Só consegui atualizá-lo ao alterar o valor da data usando o teclado e clicando fora da caixa de entrada. Corrigi isso aumentando o código do RP Niemeyer com o código do syb para obter:
Eu suspeito de colocar o observável ($ (elemento) .datepicker ("getDate")); em sua própria função e registrando-a com options.onSelect fez o truque?
fonte
onSelect
função, ela não aumentará ochange
evento ...Obrigado por este artigo, achei muito útil.
Se você deseja que o DatePicker se comporte exatamente como o comportamento padrão da UI do JQuery, recomendo adicionar um desfoque no elemento no manipulador de eventos de alteração:
ie
fonte
Resolvi esse problema alterando a ordem dos meus arquivos de script incluídos:
fonte
O mesmo que RP Niemeyer, mas melhor suporte para WCF DateTime, Timezones e Using the DatePicker onSelect JQuery propriedade.
Aproveitar :)
http://jsfiddle.net/yechezkelbr/nUdYH/
fonte
Eu acho que isso pode ser feito muito mais fácil:
<input data-bind="value: myDate, datepicker: myDate, datepickerOptions: {}" />
Portanto, você não precisa de tratamento manual de alterações na função init.
Mas, nesse caso, sua variável 'myDate' receberá apenas valor visível, não o objeto Date.
fonte
Como alternativa, você pode especificar isso na ligação:
Atualizar:
fonte
Com base na solução de Ryan, myDate retorna a sequência de datas padrão, que não é a ideal no meu caso. Eu usei o date.js para analisar o valor, para que ele sempre retorne o formato de data desejado. Dê uma olhada neste exemplo de violino .
fonte
Eu precisava atualizar repetidamente meus dados do servidor, mas não concluí o trabalho para minhas necessidades de compartilhamento abaixo (meu formato de data / data (1224043200000) /):
Depois que o modelo foi formatado corretamente para a saída, adicionei um modelo com a documentação knockoutjs :
fonte
Poucas pessoas pediram opções dinâmicas de datapicker. No meu caso, eu precisava de um período dinâmico - portanto, a primeira entrada define o valor mínimo do segundo e o segundo define o valor máximo para o primeiro. Eu o resolvi estendendo o manipulador do RP Niemeyer. Então, para o original:
Adicionei mais dois manipuladores correspondentes às opções que eu queria modificar:
E os usei assim no meu modelo:
fonte
O uso de ligações personalizadas fornecidas nas respostas anteriores nem sempre é possível. Chamando
$(element).datepicker(...)
leva um tempo considerável e, se você tiver, por exemplo, algumas dezenas ou mesmo centenas de elementos para chamar esse método, precisará fazê-lo "preguiçosamente", ou seja, sob demanda.Por exemplo, o modelo de vista pode ser inicializado, o
input
s sendo inseridos no DOM, mas os seletores de datas correspondentes serão inicializados somente quando um usuário clicar neles.Então, aqui está a minha solução:
Adicione uma ligação personalizada que permita anexar dados arbitrários a um nó:
Use a ligação para anexar o observável usado para o
input
valor de:E, finalmente, ao inicializar o datepicker, use sua
onSelect
opção:Dessa forma, toda vez que um usuário altera a data com o seletor de datas, o correspondente Knockout observável também é atualizado.
fonte