2013-03-11 2 views
0

Вот HTML код PartialView, возвращаемый сервером при AJAX вызова:Нокаут связывание частично работать

<tbody data-bind="foreach: CoverQuotesViewModel"> 
    <tr> 
     <td><input type="checkbox" data-bind="checked: IsSelected" /></td> 
     <td ><input type="text" data-bind="value: Label, enable: IsSelected" /></td>   
    </tr> 
</tbody> 

затем связывание применяется:

$.ajax("getSelectedQuote", { 
    data: ko.toJSON({ model: self.selectedQuote, model1: formData }), 
    }), 
    type: "post", contentType: "application/json", 
    success: function (result) { 

    $("#custom").html(result); 

    ko.applyBindings(self.selectedQuote, $("#covers")[0]); 
    } 
}); 

Я могу видеть мою таблицу заселяется с флажки правильно проверены или нет. Однако для непроверенных флажков соответствующий вход не выделен (отключен). Если я сниму галочку вручную, вход отключится.

Итак, почему свойство «enable» не связано в начале?

EDIT

Класс MVC Модель:

public class CoverQuoteViewModel 
{ 
    public CoverQuoteViewModel() 
    { 
     Childs = new List<CoverQuoteViewModel>(); 
    } 

    public string ProductName { get; set; } 
    public string Label { get; set; } 
    public bool IsVisible { get; set; } 
    public bool IsMandatory { get; set; } 
    public bool IsSelected { get; set; } 
    public bool IsChoice { get; set; } 
    public bool IsComposite { get; set; } 
    public decimal YearPrice { get; set; } 
    public decimal BiannualPrice { get; set; } 
    public decimal QuarterPrice { get; set; } 
    public decimal MonthPrice { get; set; } 

    public List<CoverQuoteViewModel> Childs { get; private set; } 
    public CoverQuoteViewModel SelectedCoverQuote { get; set; } 

} 

EDIT

Возвращенные данные JSON

var initialData = { "Quotes": 
[{ "ProductName": null, "MonthPrice": 0, "QuarterPrice": 0, "BiannualPrice": 0, "YearPrice": 0, "CoverQuotesViewModel": 

[{ "ProductName": null, "Label": "Première Assistance 24h/24 (GRATUITE)", "IsVisible": true, "IsMandatory": true, "IsSelected": true, "IsChoice": false, "IsComposite": false, "YearPrice": 0.97, "BiannualPrice": 0.49, "QuarterPrice": 0.25, "MonthPrice": 0.08, "Childs": [], "SelectedCoverQuote": null }, 
{ "ProductName": null, "Label": "Assistance PLUS 24h/24", "IsVisible": true, "IsMandatory": false, "IsSelected": false, "IsChoice": false, "IsComposite": false, "YearPrice": 36.06, "BiannualPrice": 18.22, "QuarterPrice": 9.20, "MonthPrice": 3.10, "Childs": [], "SelectedCoverQuote": null }, 
{ "ProductName": null, "Label": "Supplément Vol Audio", "IsVisible": true, "IsMandatory": false, "IsSelected": false, "IsChoice": false, "IsComposite": false, "YearPrice": 33.36, "BiannualPrice": 16.85, "QuarterPrice": 8.51, "MonthPrice": 2.87, "Childs": [], "SelectedCoverQuote": null } 
]}] 
}; 

Данные разобранные так:

<script type="text/javascript"> 
@{ var jsonData = new HtmlString(new JavaScriptSerializer().Serialize(Model)); } 
var initialData = @jsonData; 
</script> 

и полная ViewModel

$(function() { 
var mvcModel = ko.mapping.fromJS(initialData); 

function QuoteViewModel() { 
    var self = this; 

    self.customizeQuote = function (quote) { 
     self.selectedQuote = quote; 

     //remove the disable attribute on all form controls before serializing data 
     $(".step").each(function() { 
      $(this).find('input, select').removeAttr('disabled'); 
     }); 

     //convert form data to an object 
     var formData = $('#etape').toObject(); 

     $.ajax("getSelectedQuote", { 
      data: ko.toJSON({ model: self.selectedQuote, model1: formData }),    
      type: "post", contentType: "application/json", 
      success: function (result) { 
       debugger 
       $("#custom").html(result); 
       $("#etape").formwizard("show", "customize"); 
       ko.applyBindings(self.selectedQuote, $("#covers")[0]); 
      } 
     }); 
    }; 

    self.addRemove = function (cover) { 
     alert(cover.Label); 
    }; 
} 

var myViewModel = new QuoteViewModel(); 
var g = ko.mapping.fromJS(myViewModel, mvcModel); 
ko.applyBindings(g); 

});

+1

Как выглядит ваша модель взгляда? –

+0

Что такое 'IsSelected' – Thewads

+0

Я использую сопоставление для генерации модели представления, поэтому я не могу показать какой-либо код, но IsSelected является свойством bool в модели mvc, поэтому он отображается в функцию в модели представления. Эта часть работает, но я не понимаю, почему она не применяется с самого начала. – Sam

ответ

0

Не имея возможности увидеть ваши данные или просмотреть модель, я бы предложил установить значение IsSelected, чтобы вы могли видеть, что это за значение. Если это выглядит правильно, то есть еще одна проблема, но я не удивлюсь, если значения изначально неверны. Это может быть связано с тем, как вы сопоставляете данные с моделью просмотра, хотя я не знаю.

<td><input type="text" data-bind="value: IsSelected, enable: IsSelected" /></td> 

Я запутался, почему вы используете отображение плагина дважды в коде здесь, когда на ваших исходных данных для получения mvcModel, и один раз карту, ну, это выглядит, как вы отображения myViewModel на mvcModel. Вы имели в виду, что это так, потому что это выглядит неправильно?

Вы просматривали g в отладчике перед тем, как применитьBindings, и исследовали, как оно выглядит?

+0

Я знаю, что это не идеальный вариант, чтобы не показывать какой-либо код. Я выложу модель mvc. Однако я пробовал вашу идею, и я заметил, что когда значение True из IsSelected равно True, оно отображается в текстовом поле как True. Однако, если значение False, то оно отображается как пустое, что, безусловно, является причиной того, что вход не выделен серым цветом. Я не понимаю, что в моей модели viewmodel и моей модели mvc, когда я проверяю значение IsSelected, он правильно установлен как True, так и False. Это непустой тип булевого типа на стороне сервера. – Sam

+0

Фактически, в соответствии с документацией с нокаутом, значение null или undefined также должно считаться False .... (фактически, в соответствии с документацией с нокаутом) Итак, я немного потерял здесь ... – Sam

+0

Я на самом деле просто хотел показать пример из JSON, который вы вернетесь. Можете ли вы добавить js, где вы имеете дело с возвращенными данными, и модель js view? –

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