Comment accéder à un parent ou de la racine viewmodel de l'intérieur de liaison personnalisée dans durandal/knock-out

C'est une question à clarifier la meilleure méthode (ou toute autre méthode!) pour atteindre cet objectif. Il est peut-être la façon dont je suis en train d'appliquer mes .net de codage de l'expérience à cette nouvelle façon de faire les choses, mais je ne peux pas croire ce n'est pas un monde réel problème pour de nombreux programmeurs.

. Master view/viewmodel utilise de nombreux sous-points de vue sur la page que certaines sections de changer en fonction des choix de l'utilisateur/actions. Ces vues sont composés dans la page maître:

<div data-bind="compose: { model: articleSection, preserveContext: true }"></div>

...et dans la sous-vue, je suis en mesure de vous référer à la racine des observables qui contrôle la vue principale de la sorte:

<a href="#" class="btn" data-bind="css: { 'btn btn-default': true, 'btn-primary': $root.inEditMode() }, click: $root.setEditMode, enable: $root.articleSelected()">Edit</a>

Cependant, l'un des sous-vues a lui-même un sous-sous-point de vue qui utilise une liaison personnalisée et un modèle pour la construction que c'est un treeview et doit être en mesure de construire récursivement la mise en page.

La sous afficher le code est juste:

<div id="fancytree" data-bind="groupTree: treeGroups">
    <!--<ul data-bind="template: { name: 'itemTmpl', foreach: treeGroups }, groupTree: {}"></ul>/-->
</div>

Le modèle est juste:

    <script id="itemTmpl" type="text/html">
      <!-- Template used in labtool for tree-->
        <li>
            <span>
                <span data-bind="text: name" />
            </span>
            <ul data-bind="template: { name: 'itemTmpl', foreach: children }"></ul>
        </li>
    </script>  

La liaison personnalisée est:

ko.bindingHandlers.groupTree = {
init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
var tm = valueAccessor();
var tmUnwrapped = tm();
$(element).fancytree({
minExpandLevel: 1,
source: tmUnwrapped,
lazyload: function (e, data) {
data.result = datacontext.getGroupChildren('1111');
},
activate: function (event, data) {
var node = data.node;
var tg = rootVm.selectedGroupId();
alert(node.title);
},
})
}

Donc mon problème est que je n'arrive pas à ce que je considère comme une "variable globale" de mon .net jours, ce qui est observable dans mon top-niveau de la racine viewmodel appelé "selectedArticle". Lorsqu'un utilisateur clique sur le nœud d'arborescence, de la "activer" la fonction est activé, le message d'alerte apparaît avec les informations correctes, et je veux simplement être en mesure de mettre cette valeur dans le observables dans ma racine viewmodel qui est, effectivement, deux niveaux à partir du contexte de liaison de la liaison personnalisée gestionnaire.

Ce doit être quelque chose que les autres font, sûrement? J'ai googlé jusqu'à ce que je suis bleu dans le visage, mais je suis évidemment le manque de mots ou de concepts que j'ai besoin pour obtenir les résultats dont j'ai besoin. En pseudo-code dans la liaison personnalisée "activer la fonction de" je veux simplement être en mesure de taper dans quelque chose comme "la racine.selectedArticle = node.titre", mais évidemment de la racine n'est pas disponible dans ce mode, donc c'est de là d'où je viens décoller!

Je ne peux pas l'essayer maintenant mais bindingContext.$root doit être la racine de votre viewmodel...
Nope, désolé. var rootVm = bindingContext.$racine seulement les résultats en rootVm contenant le viewmodel de la vue actuelle: moduleId: "viewmodel/groupTree"
Avez-vous utilisé preserveContext: true dans toutes vos compose obligatoire jusqu'au sommet?
Je ne peux pas. Je l'exacte liaison que j'utilise dans mon sous-sous-vue: <!--<ul data-bind="template: { name: 'itemTmpl', foreach: treeGroups }, groupTree: {}"></ul>/--> et il n'y a pas moyen de faire un composer de la liaison que les!
Le modèle est un leurre. J'ai trouvé je n'avais même pas besoin.

OriginalL'auteur TheMook | 2013-09-12