Je me demande surtout comment organiser des choses comme les fenêtres modales et les pages dynamiques comme les profils. Le viewModel ne doit-il contenir qu'une seule vue de profil ou contenir tous les profils chargés? Ici, cela ne semble pas très "propre".
viewModel = {
profile: ko.observableArray([
new ProfileViewModel()
//... any others loaded
])
, createPostModal: {
input: ko.observable()
, submit: //do something to submit...
}
}
<div data-bind="foreach: profile"><!-- profile html --></div>
<div data-bind="with: createPostModal"></div>
Cette façon ne semble pas très cohérente. Y a-t-il quelqu'un qui a construit une application d'une seule page avec knockout qui peut offrir des conseils? Des échantillons de code seraient appréciés.
Nous ne faisons que commencer dans cette voie au travail, et nous ne savons donc pas trop ce que nous faisons. Mais voici l'idée que nous avons.
La page doit être composée d'un certain nombre de "composants", éventuellement imbriqués. Chaque composant a un modèle de vue et une méthode publique, renderTo(el)
, qui fait essentiellement
ko.applyBindings(viewModelForThisComponent, el)
Il pourrait également avoir la possibilité de restituer des sous-composants.
La construction ou la mise à jour d'un composant consiste à lui donner un modèle (par exemple des données JSON du serveur), dont il dérivera le modèle de vue approprié.
L'application est ensuite créée en imbriquant un tas de composants, en commençant par un composant d'application de niveau supérieur.
Voici un exemple d'application "hypothétique" de gestion de livre. Les composants sont LibraryUI
(affiche une liste de tous les titres de livres) et DetailsUI
(une section de l'application qui affiche les détails d'un livre).
function libraryBookViewModel(book) {
return {
title: ko.observable(book.title),
showDetails: function () {
var detailsUI = new BookDetailsUI(book);
detailsUI.renderTo(document.getElementById("book-details"));
}
};
}
function detailsBookViewModel(book) {
return {
title: ko.observable(book.title),
author: ko.observable(book.author),
publisher: ko.observable(book.publisher)
};
}
function LibraryUI(books) {
var bookViewModels = books.map(libraryBookViewModel);
var viewModel = {
books: ko.observableArray(bookViewModels);
};
this.renderTo = function (el) {
ko.applyBindings(viewModel, el);
};
}
function BookDetailsUI(book) {
var viewModel = detailsBookViewModel(book);
this.renderTo = function (el) {
ko.applyBindings(viewModel, el);
};
}
Notez comment nous pourrions faire apparaître les détails du livre dans une boîte de dialogue jQuery UI, plutôt que dans un singleton #book-details
élément, en changeant la fonction showDetails
à faire
var dialogEl = document.createElement("div");
detailsUI.renderTo(dialogEl);
$(dialogEl).dialog();
Il existe 3 frameworks qui aident à créer des SPA à l'aide de Knockoutjs.
J'ai utilisé Durandal et je l'aime vraiment. Facile à utiliser et possède de nombreuses configurations Nice pour que vous puissiez brancher vos propres implémentations. En outre, Durandal est créé par le même créateur de Caliburn qui était un cadre très populaire pour la création d'applications Silverlight/WPF.
Maintenant en 2014, vous voulez probablement utiliser la fonctionnalité de composant de Knockout et Yeoman pour échafauder votre projet ko initial. Voir cette vidéo: Steve Sanderson - Architecture de grandes applications à page unique avec Knockout.js
[mise à jour le 5 avril 2013] au moment de la rédaction, cette réponse était valide. Actuellement, je suggère également l'approche Durandal JS comme chemin à parcourir. Ou vérifiez modèles Hot Towel ou Hot Towelette SPA de John Papa si vous utilisez ASP.NET MVC. Cela utilise également Durandal.
Réponse originale ci-dessous:
Je voudrais vous montrer la série en quatre parties de Phillipe Monnets sur Knockout.js. Il est le premier Blogger que j'ai rencontré qui divise son exemple de projet en plusieurs fichiers. J'aime vraiment la plupart de ses idées. La seule chose que j'ai manquée, c'était comment gérer les collections ajax/rest récupérées en utilisant une sorte de modèle de référentiel/passerelle. C'est une bonne lecture.
Lien vers la partie 1: http://blog.monnet-usa.com/?p=354
Bonne chance!
Je viens d'ouvrir le mini-framework SPA que j'ai mis en place, Knockout étant le composant principal.
knockout-spa Un mini (mais à part entière) structure SPA construite au-dessus de Knockout, Require, Director, Sugar. https://github.com/onlyurei/knockout-spa
Démo en direct: http://knockout-spa.mybluemix.net