35 votes

Comment structurer une application d'une seule page avec knockout.js?

Je me demande surtout comment organiser des choses comme des fenêtres modales et des pages dynamiques comme des profils. Le modèle viewModel doit-il contenir un seul profil ou tous les profils chargés? Cet ici 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 KO pouvant donner des conseils? Des échantillons de code seraient appréciés.

15voto

Domenic Points 40761

Nous venons de commencer en bas de ce chemin d'accès au travail, et ne sont donc pas tout à fait sûr de ce que nous faisons. Mais voici l'idée que nous avons.

La page doit être composé 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 consiste essentiellement à ne

ko.applyBindings(viewModelForThisComponent, el)

Il peut également avoir la capacité de rendre les sous-composants.

La construction ou la mise à jour d'un composant consiste à donner un modèle (par exemple, les données JSON à partir du serveur), à partir de laquelle il va dériver la vue appropriée modèle.

L'application est alors créé par l'imbrication d'un tas de composants, à commencer par un composant de l'application.


Voici un exemple pour un "hypothétique" livre-la gestion de l'application. Les composants sont LibraryUI (affiche une liste de tous les titres de livres) et DetailsUI (une section de l'application qui affiche des détails sur 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 rendre le livre les détails apparaissent dans un jQuery dialogue de l'INTERFACE utilisateur, au lieu d'un singleton #book-details élément, en changeant l' showDetails fonction pour faire

var dialogEl = document.createElement("div");
detailsUI.renderTo(dialogEl);
$(dialogEl).dialog();

12voto

Evan Larsen Points 4352

Il y a 3 cadres qui aident à la création de SPAs à l'aide de Knockoutjs.

J'ai utilisé Durandal et je l'aime vraiment. Facile à utiliser et a beaucoup de belles configurations de sorte que vous pouvez plug-in de votre propre mise en œuvre. Aussi, Durandal est créé par le même créateur de Caliburn qui était très populaire cadre pour la construction de Silverlight/WPF applications.

6voto

Jason Points 470

Désormais, en 2014, vous souhaiterez probablement utiliser la fonctionnalité de composant de Knockout et Yeoman pour scaffler votre projet ko initial. Voir cette vidéo: Steve Sanderson - Création d’applications volumineuses pour une page avec Knockout.js

3voto

mdocter Points 568

[mise à jour le 5 avril 2013] au moment de la rédaction de cette réponse est valable. Actuellement, je dirais aussi la Durandal JS comme le moyen d'aller. Ou vérifier John Papa Chaude, une Serviette Chaude ou d'une Serviette humide SPA modèles si vous utilisez ASP.NET MVC. Cela utilise aussi Durandal.

Réponse originale à cette question ci-dessous:

Je tiens à souligner Philippe Monnets 4 partie de la série sur Knockout.js pour vous. Il est le premier Blogueur j'ai rencontrée qui divise son exemple de projet en plusieurs fichiers. J'ai vraiment comme la plupart de ses idées. La seule chose que j'ai raté, était de savoir comment gérer ajax / reste extraites des collections en utilisant un type de stockage / Passerelle modèle. C'est une bonne lecture.

Lien vers la partie 1: http://blog.monnet-usa.com/?p=354

Bonne chance!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X