200 votes

KnockOutJS - ViewModels multiples en un coup de œil

Je pense que ma demande est prise en assez grand maintenant, trop grande pour gérer chaque Vue avec un seul ViewModel.

Alors je me demandais comment il serait difficile de créer plusieurs Viewmodel et de les charger dans un seul et unique point de Vue. Avec une note que j'ai aussi besoin d'être en mesure de passer X ViewModel de données en Y ViewModel de données afin que la personne Viewmodel besoin pour être en mesure de communiquer les uns avec les autres ou au moins être au courant de toutes les autres.

Par exemple, j'ai un <select> déroulant, sélectionnez déplacer vers le bas a un état qui me permet de passer l'ID de l'élément sélectionné dans l' <select> à un autre appel Ajax dans un autre ViewModel....

Points de traiter avec de nombreux Viewmodel dans une Vue unique apprécié :)

284voto

sanatgersappa Points 2030

Knockout prend désormais en charge la liaison multiple du modèle. La `` méthode accepte un paramètre optionnel - l’élément et ses descendants à laquelle la liaison sera activée.

Par exemple :

Ceci limite l’activation de l’élément avec l’ID `` et ses descendants.

Consultez la documentation pour plus de détails.

149voto

John Papa Points 7845

Si ils doivent tous être sur la même page, un moyen facile de le faire est d'avoir une vue master modèle contenant un tableau (ou une liste de propriétés) de l'autre les modèles de vue.

masterVM = {
    vmA : new VmA(),
    vmB : new VmB(),
    vmC : new VmC(),
}

Ensuite, votre masterVM peut avoir d'autres propriétés si nécessaire, pour la page elle-même. La Communication entre les modèles de vue ne serait pas difficile, dans cette situation, comme vous avez pu le relais par le biais de l' masterVM, ou vous pouvez utiliser l' $parent / $root dans les liaisons, ou quelques autres options personnalisées.

21voto

C'est ma réponse après avoir terminé très gros projet avec beaucoup de Viewmodel de vue unique.

En Mode Html

    <!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
</head>
<body>
    <div id="container1">
        <ul>
            <li >Container1 item</li>
            <!-- ko foreach: myItems -->
            <li>Item <span data-bind="text: $data"></span></li>
            <!-- /ko -->
        </ul>
    </div>

    <div id="container2">
        <ul>
            <li >Container2 item</li>
            <!-- ko foreach: myItems -->
                <li>Item <span data-bind="text: $data"></span></li>
            <!-- /ko -->
        </ul>
    </div>

    <script src="js/jquery-1.11.1.js"></script>
    <script src="js/knockout-3.0.0.js"></script>
    <script src="js/DataFunction.js"></script>
    <script src="js/Container1ViewModel.js"></script>
    <script src="js/Container2ViewModel.js"></script>

</body>
</html>

De ce point de vue, je suis la création de 2 modèles de vue pour id=container1 et id=container2 dans deux fichiers javascript.

Container1ViewModel.js

function Container1ViewModel()
{
    var self = this;
    self.myItems = ko.observableArray();
    self.myItems.push("ABC");
    self.myItems.push("CDE");

} 

Container2ViewModel.js

function Container2ViewModel() {
    var self = this;
    self.myItems = ko.observableArray();
    self.myItems.push("XYZ");
    self.myItems.push("PQR");

}

Puis, après ces 2 viewmodel inscrivez en tant que distincte dans le viewmodel DataFunction.js

var container1VM;
var container2VM;

$(document).ready(function() {

    if ($.isEmptyObject(container1VM)) {
        container1VM = new Container1ViewModel();
        ko.applyBindings(container1VM, document.getElementById("container1"));
    }

    if ($.isEmptyObject(container2VM)) {
        container2VM = new Container2ViewModel();
        ko.applyBindings(container2VM, document.getElementById("container2"));
    }
});

Comme cela, vous pouvez ajouter n'importe quel nombre de viewmodel pour séparer les divs. Mais assurez-vous de ne pas créer des modèle de vue pour un div à l'intérieur enregistré div.

3voto

Sergey Zwezdin Points 205

Recherchez MultiModels plugin Knockout JS - https://github.com/sergun/Knockout-MultiModels

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