KnockoutJS: ko.ToJSON (isso) não funciona?
-
27-10-2019 - |
Pergunta
O seguinte java-script que define o objeto MyViewModel com uma propriedade " text " e uma função " save ".
<script type="text/javascript">
function MyViewModel() {
this.text = ko.observable('');
}
MyViewModel.prototype.save = function () {
alert(this.text()); // Works fine
var data = ko.ToJSON(this); // Error: Object doesn't support this property or method ?
$.ajax({
type: 'POST',
url: '/Person/Save',
data: data,
contentType: 'application/json',
success: function (data) {
alert(data);
}
});
};
</script>
<script type="text/javascript">
$(function () {
var viewModel = new MyViewModel()
ko.applyBindings(viewModel);
});
</script>
E o seguinte botão definido:
<button data-bind="click: save">SAVE</button>
Resultado quando o botão é clicado:
- Acessar uma propriedade usando this.text () funciona bem
- Converter o objeto java-script em um objeto JSON: ko.ToJSON (isto) não funciona e gera um erro: "Erro: o objeto não oferece suporte a esta propriedade ou método "
Provavelmente algo trivial está faltando ou errado, mas não consigo ver.Alguma dica?
Solução
Knockout não tem um método ToJSON
- ele tem um método toJSON
embora:
function MyViewModel() {
this.text = ko.observable('');
}
MyViewModel.prototype.save = function () {
alert(this.text()); // Works fine
var data = ko.toJSON(this); // Works fine too
$.ajax({
type: 'POST',
url: '/Person/Save',
data: data,
dataType: 'json',
success: function (data) {
alert(data);
}
});
};
Outras dicas
Você definiu seu modelo de visualização como uma função (uma classe, se quiser):
function MyViewModel() {
this.text = ko.observable('');
}
Em vez disso, você deve defini-lo como um var (um objeto):
var MyViewModel = {
text: ko.observable('');
}
Você deve então descobrir que o seguinte funciona bem:
var data = ko.ToJSON(MyViewModel);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow