2012-03-11 5 views
7

knockout 매핑 플러그인을 사용하여 observableArray에 객체 배열을 매핑하려고합니다. 어쨌든 이것은 전혀 나를 위해 작동하지 않는 것 같습니다.ko.mapping.fromJS를 사용하여 observableArray에 배열을 매핑하는 이상한 동작

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

returns: 
[] 

내가 잘못 뭐하는 거지 :

난 그냥 확인 Crome 스 콘솔에서 테스트? 나는 다음과 같은

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

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

을하려고하면 은 모두 잘 작동합니다. 유일한 차이점은 개체 배열 대신 단일 개체 만 제공한다는 것입니다. 그러나 맵핑 플러그인의 문서를 올바르게 읽으면 정상 배열에서 observableArray를 생성 할 수 있어야합니다. 당신의 도움에 대한

감사합니다,
안드레아스

(적어도 이론/문서에) 일을해야 무엇
+7

가 있는지 확인 : 여기

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의 비교입니다 observableArray'myObservableArray()'의 랩핑되지 않은 값을보고있는 것입니다. observableArray 자체를 인쇄 할 때 오해의 소지가 있습니다. –

+4

RP가 말한대로 ... 당신은 잘못된 값을보고 있습니다. 확인을 위해 사용할 수있는 바이올린입니다. ko.mapping 줄에 중단 점을 설정하고 ko.mapping.fromJS (data)를 입력하면 []가 표시됩니다. ko.mapping.fromJS (data)()를 입력하면 [Object, Object, Object, Object]가 표시됩니다. http://jsfiddle.net/jearles/y4b9e/8/ –

+1

감사합니다. 빈 배열을 나타내는 []를 인쇄하면 Chrome이 나를 속였습니다. 그러나 당신은 절대적으로 옳습니다. 표현 뒤에 괄호를 달았 으면 내용이 모두 올바르게 표시됩니다. 너무 빨리 의견을 받으실 수 있습니다. Stackoverflow rocks ... – nttakr

답변

1
ko.mapping.fromJS(data, {}, self.items); 
1

,하지만 분명히 그게 무엇을하고 있는지 아니다. 나는이 같은 문제가 있습니다 내가 다른 너무 생각 : https://groups.google.com/forum/?fromgroups=#!topic/knockoutjs/uKY84iZaxcs

개체가 있어야합니다 :

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

이 개체의 스키마를 고수하기 위해, 당신은 당신의 KO 뷰 모델에 객체를 매핑 할 ko.utils.arrayMap을 사용할 수 있습니다 : 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); 
}); 

편집 나는 일에 좀 더 연구를

실제로 JS 배열 객체를 KO 매핑으로 매핑 할 수 있습니다. 그러나 애프터 맵 객체는 KO Observable Array가 될 수 없습니다. 그것은 그 문제에 KO로, 당신이 할 수있는 데이터 바인딩을 위해, 그냥 평범한 JS 배열 객체가 될 것이다 : 크롬의 콘솔에서 http://jsbin.com/uzuged/5/

+0

내 매핑 된 플러그인을 사용하지 않았습니다. 나는 서버로부터 객체들의 배열을 얻었고 그것을 관찰 가능한 배열에 매핑하려고했다. 내가 사용 : self.MyObservArray (ko.utils.arrayMap (arrayfromServer, function (item) { return new BlogObject (item); }})); – LKallipo