Je suis un newby AngularJS. J'essaie d'afficher une image en utilisant un modèle de directive AngularJS et en cliquant sur l'image, je veux qu'un marqueur soit placé sur l'image. Je ne sais pas pourquoi cela ne fonctionne pas.
La première directive:
directive('hello', function() {
return {
template: '<img id="map" src="http://www.lonelyplanet.com/maps/asia/india/map_of_india.jpg" />',
link: function(scope, element, attrs) {
$('#map').click(
function(e) {
$('#marker').css('left', e.pageX).css('top', e.pageY).show();
}
);
},
};
});
Le code html
<hello>
<img id="marker" src="http://maps.google.com/mapfiles/ms/micons/blue.png" style="display: none; position: absolute;" />
</hello>
Vous manquez le restrict : 'E'
option, par défaut restrict
a la valeur AC
qui est attribut et classe, dans votre cas vous utilisez la directive comme élément.
Mise à jour: basée sur un commentaire
angular.module('test', []).directive('hello', function() {
return {
restrict : 'E',
template : '<div style="position: relative"><img id="map" src="http://www.lonelyplanet.com/maps/asia/india/map_of_india.jpg" /><img id="marker" src="http://maps.google.com/mapfiles/ms/micons/blue.png" style="display: none; position: absolute;" /></div>',
replace: true,
link : function(scope, element, attrs) {
$('#map').click(function(e) {
$('#marker').css('left', e.pageX).css('top', e.pageY)
.show();
});
}
};
});
Démo: Fiddle
Quelques autres problèmes possibles:
widgetForm
et restrict
est 'E'
ou 'A'
, Tu devrais utiliser <widget-form/>
, ne pas <widgetForm/>
.Par défaut lorsque vous créez une directive dans angularjs. si vous ignorez la propriété restrict angularjs, supposez-la comme un attribut. comme votre html montrant, vous devez écrire votre objet de retour comme ci-dessous
<body ng-app="myApp">
<hello>
<div id="marker"></div>
</hello>
</body>
et dans angular l'élément est déjà un objet jQuery même si vous n'ajoutez pas jquery, il utilisera son propre appel d'implémentation jQLite. vous ne devez donc utiliser que
var app = angular.module('myApp', []);
app.directive('hello',function(){
var linkFn = function (scope,element,attrs){
element.bind('click',function(e){
$('#marker').css('left', e.pageX).css('top', e.pageY).show();
});
};
return {
restrict : "E",
link: linkFn,
transclude:true,
template:'<div ng-transclude><img id="map" src="http://www.lonelyplanet.com/maps/asia/india/map_of_india.jpg" /></div>'
};
});
j'espère que cela aide exmaple de travail
Ce que @Arun a dit est correct. Mais ce n'est pas obligatoire. Par défaut, la directive ur sera attribuée.
Donc, au lieu d'utiliser la directive ur comme élément
<hello>
<img id="marker" src="http://maps.google.com/mapfiles/ms/micons/blue.png"style="display: none; position: absolute;" />
</hello>
essayez-le comme un attribut, comme ça
<img id="marker" src="http://maps.google.com/mapfiles/ms/micons/blue.png" style="display: none; position: absolute;" hello />
N'ajoutez pas "Directive" au premier argument de chaîne:
.directive("someDirective", someDirective)
Ça aurait dû être ça pour moi:
.directive("some", someDirective)
Au moins, il devrait l'être, si vous souhaitez utiliser:
<some>stuff</some>
Trouver des erreurs de copier-coller est affreux. En avoir besoin, c'est aussi ...: '(