2014-02-23 5 views
0

Я только что начал изучать нокаут и интересное сито.Обновить видимую привязку, сделанную в нокаут?

У меня есть «волшебник» с тремя шагами. В зависимости от выбора, сделанного на шаге 1 и 2, разные вещи должны показать на шаге 3.

Я сделал функцию в Нокаут:

self.canSendLetter = ko.computed(function() { 
    console.log('Inside canSendLetter'); 
    if (self.priceStatus == "success") { 
     return true; 
    } 
    return false; 
}); 

В моем интерфейсе я попытался следующие два DataBindings:

<input id="btnsubmit" type="submit" class="btn btn-primary btn-lg submitAbe" value="@ViewRes.StampAndSendLetter &raquo;" data-bind="visible: canSendLetter(), click: save" /> 

Я могу видеть, что во время загрузки страницы регистрируется «внутри candsendletter». Однако мне нужно это «видимое связывание» для обновления, когда я перехожу к шагу 3 в своем мастере.

В настоящее время у меня есть следующий код в goToStepThree:

self.goToStepThree = function() { 
     if (self.uploadPdf() == 1 && self.uploadFileKey() == '') { 
      self.showMissingUpload(true); 
      return false; 
     } else if (self.writeContentEditor.getData() == '') { 
      self.showMissingWriteContent(true); 
      return false; 
     } 

     var thiz = self; 
     var writtenContent = encodeURIComponent(self.htmlEncode(self.writeContentEditor.getData())); 
     $.ajax({ 
      url: self.getPriceUrl, 
      type: 'POST', 
      data: { 
       usePdf: self.uploadPdf() == 1 ? 'true' : 'false', 
       uploadFileKey: self.uploadFileKey(), 
       content: writtenContent, 
       address: self.address(), 
       postal: self.postal(), 
       city: self.city(), 
       country: self.country() 
      }, 
      dataType: 'json', 
      success: function (data) { 
       thiz.priceStatus = data.status; 
       thiz.priceStatusMessage = data.message; 
       thiz.cost(data.price); 
       thiz.numberOfPages(data.numberOfPages); 
       if (data.isAuthenticated) { 
        self.isAuthenticated(true); 
        self.isValidCredits(data.isValidCredits); 
        self.paymentMethod('Credits (' + data.credits + '$ left)'); 
       } 

       thiz.currentStep(3); 

      } 
     }); 
    }; 

Так что мой вопрос:

Как убедиться, что моя кнопка btnsubmit, является вызовом функции canSendLetter, когда я иду к третьему шагу?

EDIT:

Мой ViewModel:

Я определил priceStatus и priceStatusMessage наблюдаемыми здесь:

self.priceStatus = ko.observable(''); 
    self.priceStatusMessage = ko.observable(''); 
+0

Вы не указали нам свой полный код. Пожалуйста, включите и другие релевантные детали, дайте нам краткое воспроизведение. – Jeroen

+2

Включите 'priceStatus' в наблюдаемое вместо простого значения. Связывание «видимых» будет пересчитано при изменении значения «priceStatus». – DCoder

+3

Измените 'thiz.priceStatus = data.status;' на 'thiz.priceStatus (data.status);' и 'self.priceStatus ==" success "' to 'self.priceStatus() ==" success "' – haim770

ответ

3

Ваше priceStatus поле действительно observable, но он должен быть использован надлежащим образом:

При сравнении его стоимости е (геттер):

self.canSendLetter = ko.computed(function() { 
    console.log('Inside canSendLetter'); 
    return self.priceStatus() === "success"; 
}); 

И когда настройки это значение (сеттер):

success: function (data) { 
     thiz.priceStatus(data.status); 
     thiz.priceStatusMessage(data.message); 
     ... 
     } 

Нокаут не имеет никакого способа, чтобы получить уведомление, когда некоторые данные о вашем ViewModel изменяется, единственный способ пойти через механизм observable, который способен «уведомлять подписчиков» (например, вычисленный вами canSendLetter).

См. Documentation.

+0

Помогло много :-) Спасибо –

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