Knockout-Problem mit dynamischer Bindung

Betrachten Sie das folgende ViewModel, das über das Knockout-Mapping-Plugin generiert wird.

var originalData = {

"QuoteSelectedViewModel": {
  "ProductName": "Select",      
  "CoverQuotesViewModel": [
     {
        "Code": 1,
        "Label": "Première Assistance 24h/24 (GRATUITE)",
        "IsMandatory": true,
        "IsSelected": true,            
        "DependsOn": []
     },
     {
        "Code": 2,
        "Label": "Assistance PLUS 24h/24",
        "IsMandatory": false,
        "IsSelected": false,          
        "DependsOn": []
     },
      {
        "Code": 8,
        "Label": "Heurts Animaux / Force de la Nature",
        "IsMandatory": false,
        "IsSelected": false,        
        "DependsOn": [
           2
        ]
     },
  ]}
}

var viewModel = ko.mapping.fromJS(originalData);

ko.applyBindings(viewModel);


<div data-bind="with: QuoteSelectedViewModel">
selected quote is : <span data-bind="text: ProductName"></span>
 <!-- ko foreach: CoverQuotesViewModel -->
<br/>    
  <div data-bind: if: IsVisible>
    <input type="checkbox" data-bind="checked: IsSelected"></input>
    <input type="text" data-bind="value: Label, enable: IsSelected"></input>
  </div>
<!-- /ko -->
</div>

Jetzt möchte ich das div ausblenden, wenn IsVisible false zurückgibt. IsVisible ist noch nicht vorhanden und sollte eine berechnete beobachtbare Funktion für jedes Element des CoverQuotesViewModel-Arrays sein.

Wie erstelle ich diese berechnete beobachtbare Funktion für jedes Element?

Vielen Dank

[BEARBEITEN] Ich habe hier eine Jsfiddle hinzugefügt:http://jsfiddle.net/graphicsxp/fpKWM/

[EDIT2] Eigentlich ist im Knockout-Dokument klar, wie das geht:

Natürlich können Sie innerhalb des create callback einen weiteren Aufruf von ko.mapping.fromJS durchführen, wenn Sie dies wünschen. Ein typischer Anwendungsfall könnte sein, wenn Sie das ursprüngliche JavaScript-Objekt mit einigen zusätzlichen berechneten Observablen erweitern möchten:

var myChildModel = function (data) {ko.mapping.fromJS (data, {}, this);

this.nameLength = ko.computed(function() {
    return this.name().length;
}, this); }

[BEARBEITEN]

Hier ist der vollständige Code, der dem Vorschlag von Paul folgt: (getQuotesSuccess ist ein AJAX-Erfolgshandler.)

viewModel.getQuotesSuccess = function (result) {
var myCoverQuotesViewModel = function (data, parent) {
    var self = this;
    ko.mapping.fromJS(data, {}, this);

    self.IsVisible = ko.computed(function () {
        var visible = true;
        if (self.DependsOn().length > 0) {
            $.each(self.DependsOn(), function (index, value) {
                var dependency = viewModel.QuoteSelectedViewModel().CoverQuotesViewModel.filterByProperty("Code", value);
                if (dependency().length > 0) {
                    visible = visible & dependency()[0].IsSelected();
                } else {
                    visible = false;
                }
            });
        }

        return visible;

    }, this);
}

var mapping = {
    'CoverQuotesViewModel': {
        create: function (options) {
            return new myCoverQuotesViewModel(options.data, options.parent);
        }
    }
}

  ko.mapping.fromJS(result, mapping, viewModel);
};

Antworten auf die Frage(1)

Ihre Antwort auf die Frage