Tworzę aplikację przy użyciu bardzo zgrabnej biblioteki KnockoutJS, ale natknąłem się na przeszkodę. Na stronie html mam zwykły kontrolkę <select>
, którą chcę załadować z danymi JSON zwróconymi z usługi WWW.ObservableArray nie odzwierciedla aktualizacji danych
zdefiniować obserwowalnym tablicę następująco:
var laborRow = function() {
this.positions = ko.observableArray([]);
};
Po załadowaniu strony, wywołanie ajax jest wykonany, a dane są zwracane. W zwrotnego, I wykonaj następujące czynności:
success: function (msg) {
laborRow.positions = msg;
}
podstawie docs Ko, bym się spodziewał, że będę ustawić wynik takiego:
laborRow.positions(msg);
jednak, że tylko zgłasza błąd informujący, że "laborRow.positions w nie funkcji"
szablonu w html jest następująca:
<tbody data-bind='template: {name: "laborRowTemplate", foreach: laborLine}'> </tbody>
</div>
<script type="text/html" id="laborRowTemplate">
<tr>
<td><select data-bind='options: positions, optionsText: "Title", optionsCaption: "select", value: selectedPosition '></select></td>
</tr>
</script>
Obiekt laborRow
jest właściwością modelu ViewModel, który jest powiązany ze stroną. Z jakiegoś powodu to nie działa. Aby dodać kolejną zmarszczkę, jeśli dodam kod do podglądu w observableArray i wydrukuję jakiś fragment danych, dane tam są. Jest ładowany pomyślnie.
Wszelkie przemyślenia będą mile widziane.
Kod pełna za moim przykładem postępowania:
var laborRow = function() {
this.positions = ko.observableArray([]);
};
var projectEstimate = function() {
this.laborLine = ko.observableArray([new laborRow()]);
};
var projectViewModel = new projectEstimate();
ko.applyBindings(projectViewModel);
//and the code in the callback function on ajax success
success: function (msg) {
laborRow.positions = msg;
//laborRow.positions(msg); **this does not work - error is laborRow.positions is not a function**
},
a HTML:
<tbody data-bind='template: {name: "laborRowTemplate", foreach:
laborLine}'> </tbody>
<script type="text/html" id="laborRowTemplate">
<tr>
<td><select data-bind='options: positions, optionsText:
"Title", optionsCaption: "select", value: selectedPosition '></
select></td>
</tr>
</script>
Wreszcie, dzięki komentarzach Seana poniżej, udało mi się dostać pracy, modyfikując kod wywołanie zwrotne:
success: function (msg) {
projectViewModel.laborLine()[(projectViewModel.laborLine().length-1)].positionList(msg);
}
Dzięki za odpowiedź Seana. Stworzyłem model. W rzeczywistym viewModelu, mam obserwowalną tablicę, która po utworzeniu rozpoczyna życie od nowego obiektu workRow jako takiego: this.laborLine = ko.observableArray ([new laborRow()]); – Alex
@Alex - doskonałe ... czy mógłbyś wtedy dodać trochę więcej swojego kodu? Jak to opisujesz, obecnie wszystko * powinno * działać. –
@Alex - zaktualizowano odpowiedź, aby dokonać kolejnego ukłucia. –