2016-05-27 7 views
0

Mein Problem ist wie folgt: Ich versuche eine Checkbox-Bindung zu verwenden, um ein Array von Objekten an eine Liste ausgewählter Objekte zu binden. Mein Problem ist, ich möchte das gesamte Objekt in die Liste binden, wie folgt:Knockout: Wie überprüfte Bindung mit beobachtbaren Array von ganzen Objekten zu verwenden, sondern einzelne Eigenschaften vergleichen?

<div data-bind="foreach: items"> 
    <div> 
     <input type="checkbox" data-bind="checked: $parent.selectedItems, value: $data"> 
    </div> 
</div> 

Wo Artikel ist die Liste der Objekte zu dem selectedItems beobachtbaren Array gebunden zu sein.

Um jedoch zu überprüfen, ob der Wert "aktiviert" ist, möchte ich einzelne Objekteigenschaften vergleichen. Der Grund dafür ist, dass ich Objekte aus verschiedenen Quellen sammle, und einige repräsentieren das gleiche Objekt, aber sie sind nicht völlig identisch. Außerdem muss ich bestimmte Untereigenschaften der ausgewählten Objekte in anderen Funktionen verwenden, daher muss das gesamte Objekt an das beobachtbare Array gebunden sein.

Vielen Dank im Voraus für Anregungen!

+0

Obwohl die integrierte Bindung dies nicht zulässt, wie Jonathan in seiner Antwort gezeigt hat, können Sie dies mit einer benutzerdefinierten Bindung tun. Ein Startpunkt könnte hier sein: http://StackOverflow.com/A/15215412/1287183 –

Antwort

1

Wenn Sie den Knockout api graben sich in man dann sehen kann, wenn die ‚überprüft‘ Parameter ein Array ist, bestimmt die Bindungs ​​Handlers, wenn der Wert in dem Array als solche:

element.checked = ko.utils.arrayIndexOf(modelValue, checkedValue()) >= 0; 

Typischerweise checkedValue() wird in den Optionen auf den Punkt eingestellt wird, als ‚$ data‘ mit dem gleichen Wert:

var list = ko.observableArray({ value: "One" }, { value: "Two" }); 
var objectsInList = ko.observableArray(list[0]); 

in einer Optionen wie diese Bindung, in denen checkedValue nicht angegeben ist, wird der Wert von $ data das Objekt sein :

<select data-bind="options: list, checked: objectsInList"> 

Ich habe checkedValue nicht angegeben und daher wird die arrayIndexOf() -Operation im überprüften Bindungshandler basierend auf der Objektreferenz ausgeführt.

Was wollen Sie in der K.-o.-Dokumentation tun angegeben: http://knockoutjs.com/documentation/checked-binding.html

Sie können checkedValue in den Daten-bind Parameter wie folgt festgelegt:

var list = ko.observableArray({ value: "One" }, { value: "Two" }); 
var objectsInList = ko.observableArray("One"); 

<select data-bind="options: list, checked: objectsInList, checkedValue: 'value'"> 

Wenn Sie mehrere Objektparameter zu handhaben wollen Ich denke, Sie müssten Ihren eigenen Bindungshandler schreiben.

+0

Ich habe die meisten davon selbst untersucht, aber zumindest ist deine Antwort korrekt und du hast dein Bestes getan beantworte die Frage vollständig. Danke für die durchdachte Antwort! – user3645275

0

Änderung Ihrer html

data-bind="foreach: { data: items, as: 'item'}"> 
    <div> 
    <input type="checkbox" data-bind="checked: item.checked, value: item.value"> 
    </div> 
</div> 

Struktur Ihre Artikel als

this.items = ko.observableArray([ 
    {checked: true1, value : value1}, 
    {checked: true2, value : value2}, 
    {checked: true3, value : value3}, 
]) 

Natürlich im wirklichen Leben Sie haben keine Variablen genannt TRUE1, Wert1 etc, das wäre json Daten zurückgegeben aus eine API

Hinweis: zur Vermeidung von Problemen mit this Sie wahrscheinlich zu Beginn Ihrer Ansichtsmodell wollen

`var self = this` 

und verwenden

`self.items = ` 
+0

Ich versuche, die überprüfte Bindung zu verwenden, die jedoch auf ein beobachtbares Array verweist. Dies wird im zweiten Beispiel hier gezeigt: http://knockoutjs.com/documentation/checked-binding.html. Ich brauche das Array, um nachfolgende Prozesse zu beschleunigen/zu vereinfachen. – user3645275

+0

Ich denke, du musst dein ViewModel teilen - oder zumindest die relevanten Teile. Im Allgemeinen sollte Ihre "checked" Eigenschaft im viewModel berechnet oder über ein Observable gesetzt werden. Sie können immer $ index verwenden, um in ein Array zu verlinken, wenn die Eigenschaften in der gleichen Reihenfolge wie die Elemente sind. – brianlmerritt

1

Sie Funktionen in Bindings verwenden können.

Denken Sie daran, Bindings wickeln Sie Ihren Code in berechnet und das ist, wie Sie Auto UI aktualisieren. Dies bedeutet, dass Knockout ui möglicherweise nicht aktualisiert wird, wenn Sie es auch erwarten.

Aber wirklich, Sie müssen konsistente Daten in Ihrem Ansichtsmodell haben.

+0

stimme ich zu, aber während ich nicht derjenige bin, der die Webdienste macht, kann ich das nicht wirklich erzwingen um mit dem zu arbeiten, was sie mir geben – user3645275

+0

@ user3645275 können Sie immer Daten von WebService verarbeiten und konsistentes Modell vor dem Binden von ihnen erstellen – flapenguin

+0

Nicht wirklich .. In meinem Fall ist die neue Information zu einem späteren Zeitpunkt noch relevant (auch wenn es von der unterscheidet altes Objekt) – user3645275

Verwandte Themen