2011-05-16 3 views
1

J'essaie de décider de la meilleure façon de structurer mon application, et je suis un peu confus. Je veux que ma structure de base pour être quelque chose comme ceci:KnockoutJS: imbriquer ko.observableArray

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

La façon dont je crée la « bannière » est en le définissant comme une classe comme ceci:

// 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), 
    }; 
}; 

Est-ce correct méthode? Je ne sais pas comment "imbriquer" le tableau "previewURLs" dans la bannière elle-même. J'ai essayé de le faire ci-dessus mais cela ne semble pas fonctionner.

Puis dans mon 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")); 
    } 
}; 

Overally, je suis juste confus sur la façon de le structurer. Je n'ai jamais travaillé avec une structure MVVM ou MVC auparavant, donc c'est tout nouveau pour moi.

Je pense que je serais en mesure d'accéder à mes bannières previewURLs en faisant quelque chose comme banners.banner.previewURL(1), mais je peux être loin dans cette réflexion. Puis-je simplement définir un nouvel URL d'aperçu à l'intérieur de la définition d'une nouvelle bannière?

Répondre

3

Je pense que vous avez la bonne idée. Vous ne pouvez pas accéder à viewModel.previewURLs tant que votre objet viewModel n'a pas été créé. Vous voudrez probablement passer vos previewURL dans la fonction de constructeur de bannière ou stocker vos URL de preview dans une variable précédemment définie qui peut être accédée dans le constructeur de bannière.

Exemple de passage dans l'aperçuURLs ici: http://jsfiddle.net/rniemeyer/bZhCk/