2014-01-25 4 views
0

У меня есть проект 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:

Я еще не нашел решение, но похоже самозагрузка влияет на как вещи происходят здесь. Тот факт, что ярлык, определяющий «цвет» и «действие» флажка, находится вокруг него, при щелчке по галочке он меняет состояние (активное/неактивное), но не меняет значение флажка, поэтому не запускает что-нибудь еще.

+0

Возникли ли ошибки в консоли JavaScript вашего браузера? – nemesv

+0

Нет, ничего на консоли. – Oakcool

ответ

0

Вашего связывание выражения

data-bind="checked: Job.AbreviaNome" 

Я предполагаю, что вы используете «с» заявлением ранее в вашем HTML - или что-то, что определяет «работу»? В противном случае вы должны получить сообщение об ошибке, но вы заявляете, что в консоли ничего нет.

Исходное значение AbreviaNome - это @ Model.AbreviaNome.ToString(). ToLower(), и это может не преобразовать в логическое значение, которое ожидает проверочное связывание.

+0

Значение устанавливается правильно, но подписка никогда не происходит, если вы посмотрите на код, я смотрю на «Job.AbreviaNomeSubscriptions()», он всегда возвращает ZERO. – Oakcool

+0

Я не использую a, Job является «свойством» родительского представления (JobDetailsViewModel), и именно поэтому я использовал «Job.AbreviaNome» в качестве связывания. – Oakcool

+0

@ Model.AbreviaNome.ToString(). ToLower() приводит к «истинному» или «ложному», и это соответствующий синтаксис jscript, если я этого не делаю, я получаю сообщение об ошибке «0x800a1391 - ошибка времени выполнения JavaScript : «True» undefined » – Oakcool

0

Мне кажется, что вы все делаете правильно. Фактически, когда я извлекаю соответствующие части вашего кода для тестирования, он отлично работает!

JSFiddle Test

Пожалуйста, проверьте еще раз за ошибки консоли во время загрузки и после изменения значения флажка.

Смежные вопросы