Странный массив отображения поведения в observableArray с помощью ko.mapping.fromJS - PullRequest
7 голосов
/ 11 марта 2012

Я пытаюсь отобразить массив объектов в observableArray с помощью плагина отображения нокаута. Каким-то образом это, кажется, не работает для меня вообще.

Я только что проверил с консолью Crome, чтобы проверить:

ko.mapping.fromJS( [ { x: 1, y: "test" } ] )

returns:
[]

Что я делаю не так? Если я попробую следующее

ko.mapping.fromJS( [ { x:1, y: "test" } ][0] )

returns an object containing x and y as observables...

все работает хорошо. Разница лишь в том, что я поставляю только один объект вместо массива объектов. Но если я правильно прочитал документацию по подключаемому модулю, он сможет обрабатывать создание observableArray из обычного массива.

Спасибо за вашу помощь,
Andreas

Ответы [ 2 ]

1 голос
/ 11 января 2013

Это то, что он должен делать (по крайней мере, в теории / документации), но, очевидно, это не то, что он делает. У меня такая же проблема, и я верю и другим: https://groups.google.com/forum/?fromgroups=#!topic/knockoutjs/uKY84iZaxcs

Объект должен быть:

{ "someName" : [ { x: 1, y: "test" } ] }

Чтобы придерживаться схемы объекта, вы можете использовать ko.utils.arrayMap для сопоставления объекта с вашей KO ViewModel: http://www.knockmeout.net/2011/04/utility-functions-in-knockoutjs.html

function Item(name, category, price) {
    this.name = ko.observable(name);
    this.category = ko.observable(category);
    this.price = ko.observable(price);
    this.priceWithTax = ko.dependentObservable(function() {
        return (this.price() * 1.05).toFixed(2);
    }, this);
}

//do some basic mapping (without mapping plugin)
var mappedData = ko.utils.arrayMap(dataFromServer, function(item) {
    return new Item(item.name, item.category, item.price);
});

EDIT

Я провел еще несколько исследований по этому вопросу, и вы МОЖЕТЕ на самом деле отобразить объект массива JS с отображением KO, однако объект after-map НЕ будет KO Observable Array. Это будет просто обычный объект массива JS, и, в этом отношении, вы можете связать данные с помощью KO:

var bd = [ { x: 1, y: "bd test" }, { x: 2, y: "bd test 1dsf" } ];

var bdViewModel = ko.mapping.fromJS(bd);

// 'bdViewModel' is NOT KO Observable Array, so you can't use KO Binding. However, all the properties of 'bdViewModel' (x and y) are KO Observable.
//ko.applyBindings(bdViewModel, $("#bd").get(0));
console.log(bdViewModel());

// 'bdViewModel' must be called as function (with open and close parentheses) to see the data.
$.each(bdViewModel(), function (i, d) {
  $("#bdList").append("<li>" + d.y() + "</li>");
});

Вот JSBin для сравнения отображаемого массива JS и JSON: http://jsbin.com/uzuged/5/

1 голос
/ 21 октября 2012
ko.mapping.fromJS(data, {}, self.items);
...