У меня есть проект ASP.NET MVC, и я использую нокаут, у меня есть несколько флажков, и я хочу, чтобы они запускали и обновляли на сервере при их изменении. Мне было предложено использовать подписку и поместить мой код (вызов Ajax) в обратный вызов подписки.Нокаут Наблюдаемая подписка Файринг для подписки
Проблема в том, что подписка не подписывается, поэтому код никогда не запускается.
<script type="text/javascript">
function JobViewModel() {
var self = this;
var baseUri = '/Api/Pedidos/';
self.TotalItems = ko.observable(@Model.TotalItems);
self.AbreviaNome = ko.observable(@Model.AbreviaNome.ToString().ToLower());
self.AbreviaFantasia = ko.observable(@Model.AbreviaFantasia.ToString().ToLower());
self.AbreviaLogradouro = ko.observable(@Model.AbreviaLogradouro.ToString().ToLower());
self.AbreviaComplemento = ko.observable(@Model.AbreviaComplemento.ToString().ToLower());
self.AbreviaBairro = ko.observable(@Model.AbreviaBairro.ToString().ToLower());
self.AbreviaCidade = ko.observable(@Model.AbreviaCidade.ToString().ToLower());
self.AbreviaExtra = ko.observable(@Model.AbreviaExtra.ToString().ToLower());
self.AbreviaNomeSubscriptions = ko.computed(function() {
return self.AbreviaNome.getSubscriptionsCount();
})
var updatableData = {
Id: '@Model.Id',
Status: '@((int)Model.Status)',
File: '@Model.File',
AbreviaNome: self.AbreviaNome,
AbreviaFantasia: self.AbreviaFantasia,
AbreviaLogradouro: self.AbreviaLogradouro,
AbreviaComplemento: self.AbreviaComplemento,
AbreviaBairro: self.AbreviaBairro,
AbreviaCidade: self.AbreviaCidade,
AbreviaExtra: self.AbreviaExtra
};
self.update = function() {
alert(updatableData.AbreviaNome());
$.ajax({
type: "PUT",
url: baseUri + '@Model.Id',
data: ko.toJSON(self),
dataType: "json",
contentType: "application/json"
})
.done(function (data) {
alert('Magic');
})
.error(function (jqXHR, textStatus, errorThrown) {
alert(errorThrown);
alert("fail");
});
};
self.AbreviaNome.subscribe(function (newValue) {
alert(newValue);
self.update();
});
}
function JobDetailsViewModel() {
var self = this;
var baseUri = '/Api/Pedidos/';
self.Job = new JobViewModel();
};
$(document).ready(function() {
ko.applyBindings(new JobDetailsViewModel());
$('input[type=file]').bootstrapFileInput('Selecione o arquivo');
});
</script>
кусок HTML
<div class="col-lg-10">
<div class="btn-group btn-group-sm" data-toggle="buttons">
<label class="btn btn-default " data-bind="css: {active:Job.AbreviaNome}">
<input type="checkbox" data-bind="checked: Job.AbreviaNome" name="type" id="AbreviaNome">Nome/Razão<span data-bind="text: ' (' + Job.AbreviaNomeSubscriptions() + ')'"></span><span data-bind="text: ' (' + Job.AbreviaNome() + ')'"></span></input>
</label>
<label class="btn btn-default" data-bind="css: {active: Job.AbreviaFantasia}">
<input type="checkbox" data-bind="checked: Job.AbreviaFantasia" name="type" id="AbreviaFantasia">Apelido/ Fantasia </input>
</label>
</div>
Похоже, все правильно, но когда я нажимаю флажок, ничего не происходит.
EDIT:
Я еще не нашел решение, но похоже самозагрузка влияет на как вещи происходят здесь. Тот факт, что ярлык, определяющий «цвет» и «действие» флажка, находится вокруг него, при щелчке по галочке он меняет состояние (активное/неактивное), но не меняет значение флажка, поэтому не запускает что-нибудь еще.
Возникли ли ошибки в консоли JavaScript вашего браузера? – nemesv
Нет, ничего на консоли. – Oakcool