Was ich tun würde, würde ich ein separates View-Modell für jedes Array erstellen und versuchen, sie auf eine Weise zu halten, so dass Sie in der Lage sein würden, eine neue Instanz VM
leicht hinzuzufügen und Sie auch zugreifen können jeder observableArray
um hinzuzufügen oder irgendwelche Manipulationen.
In Ihrem Code Sie haben keinen Zugang zu this.slides
new Slide
zu schieben, das ich es nicht in Ihrem Code gefunden.
Beispiel: https://jsfiddle.net/kyr6w2x3/6/
function PageItemViewModel(data){
var self = this;
self.pageName = ko.observable(data.pageName);
self.pageRows = ko.observableArray([]);
// create a new instance of PageRowItemViewModel for each data.pageRows
self.pageRows($.map(data.pageRows, function (item) {
return new PageRowItemViewModel(item);
}));
}
function PageRowItemViewModel(data){
var self = this;
self.rowType = ko.observable(data.rowType);
self.slides = ko.observableArray([]);
self.rowBackgroundColor = ko.observable(data.rowBackgroundColor);
// create a new instance of SlideItemViewModel for each data.slides
self.slides($.map(data.slides, function (item) {
return new SlideItemViewModel(item);
}));
}
function SlideItemViewModel(data){
var self = this;
self.slideTitle = ko.observable(data.slideTitle);
self.slideImage = ko.observable(data.slideImage);
}
function ViewModel(data){
var self = this;
// Define an observableArray
self.pages = ko.observableArray([]);
self.OutputJson = function(){
console.log(ko.toJSON(self));
}
self.newSlideTitle = ko.observable();
self.newSlideImage = ko.observable();
// create a new instance of PageItemViewModel for each website
self.pages($.map(website, function (item) {
return new PageItemViewModel(item);
}));
self.removePage = function(pageName) { self.pages.remove(pageName) };
self.removeRow = function(rowType) { this.pageRows.remove(rowType) };
self.addRow = function(rowType) {
//
}
self.removeSlide = function(slide) { this.slides.remove(slide) };
self.removeSlide = function(slide) { this.slides.remove(slide) };
self.addSlide = function(item) {
//here you have an access to your item which is an instance of your PageRowItemViewModel
item.slides.push(new SlideItemViewModel({slideTitle :self.newSlideTitle() ?self.newSlideTitle() : "NEW" ,slideImage :self.newSlideImage() ? self.newSlideImage() : "NEW IMAGE" }));
};
}
// rowImages:" 'image1.jpg','image2.jpg','image3.jpg' "
var website = [
{pageName: "Home", pageType:"home", pageRows: [
{rowType: "slideshow", rowBackgroundColor: "#ddddef", slides: [
{ slideTitle:"Fabulous", slideImage:"img1.png"},
{ slideTitle:"Amazing", slideImage:"img2.png"},
{ slideTitle:"Elegant", slideImage:"img3.png"}
] },
{rowType: "slideshow", rowBackgroundColor: "#ffddcc", slides: [
{ slideTitle:"Wonderful", slideImage:"img1.png"},
{ slideTitle:"Compelling", slideImage:"img2.png"},
{ slideTitle:"Magestic", slideImage:"img3.png"}
] }
]
},
{pageName: "about", pageRows: []},
{pageName: "contact", pageRows: []}
];
_vm = new ViewModel(website);
ko.applyBindings(_vm);
Wow, danke. Ich werde das lernen und lernen, es richtig zu machen! :) –