Je viens d'écrire un plugin jQuery pour cela. Il utilise également l' .data()
méthode.
Inscription:
J'ai enveloppé / mandaté l'épine Dorsale de Vue setElement
méthode pour joindre les données nécessaires à l'affichage de $el
de la propriété.
L'inscription se fait en coulisses comme suit:
$(myViewsEl).backboneView(myView);
Récupération:
Le plugin traverse la hiérarchie DOM (à l'aide d' .closest()
) jusqu'à ce qu'il trouve un élément avec la saisie de données requises, j'.e un élément du DOM avec une vue associée:
var nearestView = $(e.target).backboneView();
En outre, nous pouvons spécifier de quel type de colonne vertébrale Vue que l'on veut obtenir, en continuant la hiérarchie jusqu'à ce que nous trouver un exemple de même type:
var nearestButtonView = $(e.target).backboneView(ButtonView);
JSFiddle Exemple:
Peut être trouvé ici.
Notes:
J'espère que je me trompe en pensant que il n'y a pas de fuites de mémoire en cause ici; Un 'dissocier' est exécuté si setElement
est appelé une seconde fois, et depuis la suppression d'une vue de l'élément appels .remove()
par défaut, ce qui détruit toutes les données ainsi. Laissez-moi savoir si vous pensez différemment.
Le code du plugin:
(function($) {
// Proxy the original Backbone.View setElement method:
// See: http://backbonejs.org/#View-setElement
var backboneSetElementOriginal = Backbone.View.prototype.setElement;
Backbone.View.prototype.setElement = function(element) {
if (this.el != element) {
$(this.el).backboneView('unlink');
}
$(element).backboneView(this);
return backboneSetElementOriginal.apply(this, arguments);
};
// Create a custom selector to search for the presence of a 'backboneView' data entry:
// This avoids a dependency on a data selector plugin...
$.expr[':'].backboneView = function(element, intStackIndex, arrProperties, arrNodeStack) {
return $(element).data('backboneView') !== undefined;
};
// Plugin internal functions:
var registerViewToElement = function($el, view) {
$el.data('backboneView', view);
};
var getClosestViewFromElement = function($el, viewType) {
var ret = null;
viewType = viewType || Backbone.View;
while ($el.length) {
$el = $el.closest(':backboneView');
ret = $el.length ? $el.data('backboneView') : null;
if (ret instanceof viewType) {
break;
}
else {
$el = $el.parent();
}
}
return ret;
};
// Extra methods:
var methods = {
unlink: function($el) {
$el.removeData('backboneView');
}
};
// Plugin:
$.fn.backboneView = function() {
var ret = this;
var args = Array.prototype.slice.call(arguments, 0);
if ($.isFunction(methods[args[0]])) {
methods[args[0]](this);
}
else if (args[0] && args[0] instanceof Backbone.View) {
registerViewToElement(this.first(), args[0]);
}
else {
ret = getClosestViewFromElement(this.first(), args[0]);
}
return ret;
}
})(jQuery);