jsPlumb - dynamique de terminaison d'ancrage de chaque côté
Je suis en train d'essayer de trouver un moyen comment ajouter des ancres d'extrémité de manière dynamique à jsPlumb conteneur.
Je voudrais avoir une source d'extrémité sur le côté gauche et cible les ordinateurs d'extrémité sur le côté droit seulement.
Le problème, c'est que je n'étais pas en mesure de trouver un moyen de le faire, sans avoir recours à certains hacks, comme je le fais maintenant.
jsPlumb prend en charge Continue Ancres, mais la position de l'ancrage individuel sera recalculé en fonction de l'orientation entre les connecteurs et le nombre continue d'ancres. Cela signifie à la fois la source et la cible des points de terminaison peut être le partage d'un même côté du conteneur, c'est quelque chose que je voudrais éviter.
Ici est un jsFiddler code je suis venu avec
Voici une partie du code que j'utilise hack et recalculer les positions d'ancrage moi-même (lors de l'Ajout du bouton est cliqué), avec quelques buggy résultats 🙁
function fixEndpoints(endpoints) {
//there are 2 types - input and output
var inputAr = $.grep(endpoints, function (elementOfArray, indexInArray) {
return elementOfArray.isSource; //input
});
var outputAr = $.grep(endpoints, function (elementOfArray, indexInArray) {
return elementOfArray.isTarget; //output
});
calculateEndpoint(inputAr, true);
calculateEndpoint(outputAr, false);
}
function calculateEndpoint(endpointArray, isInput) {
//multiplyer
var mult = 1 / endpointArray.length;
for (var i = 0; i < endpointArray.length; i++) {
if (isInput) {
endpointArray[i].anchor.x = 1;
endpointArray[i].anchor.y = mult * i;//, 1, 0] };
}
else {
endpointArray[i].anchor.x = 0;
endpointArray[i].anchor.y = mult * i;//, -1, 0] };
}
}
}
//Add additional anchor
$(".button_add").live("click", function () {
var parentnode = $(this)[0].parentNode.parentNode;
jsPlumb.addEndpoint(
parentnode,
anEndpointSource
);
jsPlumb.addEndpoint(
parentnode,
anEndpointDestination
);
//get list of current endpoints
var endpoints = jsPlumb.getEndpoints(parentnode);
//fix endpoints
fixEndpoints(endpoints);
jsPlumb.recalculateOffsets();
jsPlumb.repaint(parentnode);
});
Comme vous pouvez le voir sur l'image ci-dessus, de gauche est la seule source d'extrémité (Dot) et à droite (Encadré) ne cible que les points de terminaison, une fois le nouveau point de terminaison est ajouté, les ancres sont recalculées sur la base du nombre d'ancres sur un côté.
Cela fonctionne, mais encore buggé: la position est mise à jour seulement une fois que j'ai déplacer le conteneur et la connexion entre les conteneurs n'est pas correct ainsi.
Ce que j'aimerais avoir, c'est une façon pour elle de travailler et de se connecter correctement ces éléments (de préférence à l'utilisation correcte des jsPlumb code sans avoir recours à des hacks)
Vous devez vous connecter pour publier un commentaire.
J'ai enfin compris comment le faire. Il a été plus facile que je pensais.
Code est fondamentalement la même, avec quelques modifications, ici est mis à jour fiddler échantillon
Modifications que j'ai effectuées:
Maintenant, je spécifiez point de terminaison d'ancrage de décalage lorsque je l'ajouter, je n'ai calculer la position du point d'ancrage, de sorte compensée ne change jamais, il est toujours correct dès le départ:
Une fois de point de terminaison est ajouté, j'ai re-calculer les positions d'ancrage et d'appel (cela va repeindre les connexions):
jsPlumb.repaintEverything();
Voici le résultat final:
Vous pouvez supprimer unis par un double clic en ajoutant
fonction de votre jsPlumb.prêt de la fonction. vous pouvez ajouter ceci à votre tous les états par l'ajout de
ici statemachine-demo est l'id de la div dans votre contaner et de l'état est de classe de l'etat divs.
merci pour la solution, il fonctionne très bien lorsque le point d'ancrage du côté est prédéfini, comme ici, les sources sont toujours sur le côté gauche, et les objectifs sont toujours sur la droite.
Mais si ils sont dynamiques, nous avons besoin de mettre en œuvre le côté de la sélection aussi par nous-mêmes?
Comme une solution de contournement à ce que j'ai fait est plus possible d'ancrage des postes dans la config par défaut. Une meilleure idée?
grâce