7 votes

Angular.js $compile renvoie un tableau de html mais pas le html réel

J'ai le code suivant :

app.directive('mySample', function($compile) {
    return {
        //template:"<input type='text' ng=model='sampleData'/> {{sampleData}} <br/>"
        link: function(scope, element, atts, controller) {
            var markup = "<input type='text' ng=model='sampleData'/> {{sampleData}} <br/>";  
            angular.element(element).html($compile(markup)(scope));
            console.log($compile(markup)(scope));
        }
    };
});

Et je m'attendrais à ce qu'il génère une entrée, un span qui est couplé via le scope et un break. Cependant, j'obtiens cette sortie :

[[object HTMLInputElement], [object HTMLSpanElement], [object HTMLBRElement]]

J'ai également essayé le modèle, dans le commentaire ici, séparément et ensuite en commentant la partie lien. Cela génère les éléments input et break mais pas le span qui montre le modèle couplé input sampleData.

J'ai un échantillon qui ne fonctionne pas à http://jsfiddle.net/KvdM/nwbsT/ qui le démontre.

15voto

CodeHater Points 13377

Essayez ça :

element.html(markup);
$compile(element.contents())(scope);

10voto

Derek Ekins Points 5524

L'exécution de la fonction retournée par le service $compile donne des éléments DOM plutôt que du html. Vous devez donc les insérer dans votre page en utilisant append (ou équivalent) :

angular.element(element).append($compile(markup)(scope));

1voto

zsong Points 20492

Le plus simple est peut-être d'utiliser un modèle codé en dur plutôt qu'un modèle généré dynamiquement.

<div ng-app="myApp">
    <my-sample sample-data="'test'"></my-sample>
</div>

var app = angular.module('myApp', []);

app.directive('mySample', function ($compile) {
    return {
        restrict: 'E',
        scope: {
            sampleData: '=sampleData'
        },
        template: "<input type='text'/> {{sampleData}} <br/>",
    };
});

FIDDLE

-1voto

Carlos León Points 9

Cela dépend du type de données qui doivent être compilées, parfois Angular renvoie un type de nœud de commentaire.

Le noeud pertinent que nous voulons utiliser est le noeud next() (son premier frère).

var tpl = '<div class="myWidget" ng-include="'templates/myWidget.html'"></div>;
var _myWidget = $compile(tpl)(scope);
var myWidget = null;

scope.$on('$includeContentLoaded', function () {
    myWidget = _myWidget.next();
});

-1voto

Pedro Points 559

Il suffit d'ajouter le jquery pour utiliser ".html" et de corriger le nommage du ng-model.

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