KnockoutJS: anidamiento de ko.observableArray

Estoy tratando de decidir la mejor manera de estructurar mi aplicación y me estoy confundiendo un poco. Quiero que mi estructura básica sea algo como esto:

banners (ko.observableArray)
   - banner 
       - previewURLs (ko.observableArray)

La forma en que estoy creando el "banner" es definiéndolo como una clase así:

// define a "banner" class
function banner(inventory, name, advertiser, artType, artSize, previewURLs) {
    return {
        inventory : ko.observable(inventory),
        name : ko.observable(name),
        advertiser : ko.observable(advertiser),
        artType : ko.observable(artType),
        artSize : ko.observable(artSize),
        previewURLs : ko.observableArray(previewURLs),

        // track if our banner is selected
        isSelected : ko.observable(false),  
    };
};

¿Es este el método correcto? No estoy seguro de cómo "anidar" la matriz "previewURLs" en el propio banner. Intenté hacerlo arriba, pero no parece funcionar.

Entonces en mi viewModel:

var viewModel = {
    selectAll: ko.observable(false),
    banners : ko.observableArray([
        new banner("network", "Banner #1", "Target and Friends", "3rd Party", "300x250"), 
        new banner("oo", "Banner #2", "IBM", "Flash", "720x90")
    ]),
    previewURLs : ko.observableArray([
        new previewURL("test site #1", "http://www.google.com"),
        new previewURL("test site #2", "http://www.google.com")
    ]),
    addBanner : function() {
        this.banners.push(new banner("network", "Banner"));
    }
};

En general, estoy confundido sobre cómo estructurarlo. Nunca antes había trabajado con ninguna estructura MVVM o MVC, así que esto es algo nuevo para mí.

Creo que podría acceder a las URL de vista previa de mis banners haciendo algo como banners.banner.previewURL(1), pero puedo estar muy equivocado en ese pensamiento.

¿Puedo definir una nueva URL de vista previa dentro de la definición de un nuevo banner?

preguntado el 16 de mayo de 11 a las 17:05

1 Respuestas

Creo que tienes la idea correcta. No se puede acceder a viewModel.previewURLs hasta que se haya creado su objeto viewModel. Es probable que desee pasar sus URL de vista previa a la función del constructor de banner o almacenar sus URL de vista previa en una variable previamente definida a la que se puede acceder dentro del constructor de banner.

Muestra de pasar URLs de vista previa aquí: http://jsfiddle.net/rniemeyer/bZhCk/

contestado el 16 de mayo de 11 a las 22:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.