2014-01-05 3 views
1

Вот что я издевался из моего кода MVC:Отображение массива в Knockout

$(function(){ 

    var ViewModel = function(){ 
     this.items = ko.observableArray(null); 
     this.isLoading = ko.observable(true); 
    }; 

    var data = [{"CreatedAt":"2013-12-29T22:00:20","Intro":"","Body":"","Title":"Test Item","Url":"/news-items/test-item/"},{"CreatedAt":"2013-12-29T21:13:34","Intro":"","Body":"","Title":"Test 1","Url":"/news-items/test-1/"},{"CreatedAt":"2013-12-29T16:03:56","Intro":"","Body":"<p>In the spirit of Christmas we are holding a Christmas photo competition for all members to enter. Prizes will be given to the best Christmas themed photo and the funniest photo.&nbsp; To enter, simply email your photo to: [email protected] Your entry will be uploaded onto the club's Facebook page where all members can then vote by 'liking' their favourite photo.</p>\n<p>Entries close on the 20th of December and voting will be open until the 5th of January. The winning photo's will be displayed on the website.</p>","Title":"Christmas 2013 Photo Competition","Url":"/news-items/christmas-2013-photo-competition/"}]; 
    var vm = new ViewModel(); 
    ko.applyBindings(vm); 
    vm.items(test); 
    vm.isLoading(false); 
}) 

Я дразнил его из моего кода MVC, но data объект в основном то, что было возвращено из моего контроллера. В этом случае отображение нокаутом не работает, и я подозреваю, что это способ возвращения моих данных. Правильно ли это, или мне нужно обернуть его в DTO сортировки, например: { items: [{item1:'...'},{item2:'...'}]}?

Спасибо.

EDIT: Моя ошибка, я уже определил items как observableArray. Я использую его таким образом, чтобы как только страница загрузила загрузчик gif. Я сделал это так раньше, единственное различие на этот раз - это формат json.

ДОБАВЛЕНО: Вот example

ответ

0

ko.mapping.fromJS(data) В возвращает ko.observableArray, если параметр data уже является массивом.

Так что вам нужно разворачивать возвращаемый ko.observableArray перед назначением его:

var vm = new ViewModel(); 
ko.applyBindings(vm); 
var test = ko.mapping.fromJS(data); 
vm.items(test()); // you need to write `test()` to get the underlaying array. 

Или вы можете сразу заполнить ваш уже заявил ko.observableArray с письмом:

var vm = new ViewModel(); 
ko.applyBindings(vm); 
ko.mapping.fromJS(data, {} /* mapping options */, vm.items); 

Вот ваш обновленный JSFiddle.

1

Я не знаю, если это единственная проблема, но

this.items = ko.observable(null); 

должен быть

this.items = ko.observableArray(); 

Но я, наверное, сделать все это более подобные

$(function(){ 
    var ViewModel = function(items){ 
     this.items = ko.observableArray(items); 
    }; 

    var data = [...]; 
    var vm = new ViewModel(data); 
}) 

UPDATE: Here is a fully working jsfiddle

+0

Спасибо, я тоже пробовал это, и он тоже не работает. Кажется, что вывод 'ko.mapping.fromJS (data)' правильный, поэтому я должен упустить что-то фундаментальное здесь. Это мой последний пример: http://jsfiddle.net/u54mn/10/ – codedog

+0

Я обновил свой ответ рабочим jsfiddle. Основная проблема заключалась в одновременном сопоставлении наблюдаемого массива - вам не нужно, потому что fromJS возвращает наблюдаемый массив для вас. –

Смежные вопросы