2013-07-26 8 views
6

Mam następujący kod:

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)); 
     } 
    }; 
}); 

I byłoby oczekiwać, że do wygenerowania wejściowe, jakiś przedział, który jest sprzężony poprzez zakres i przerwy. Jednak uzyskać ten wynik:

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

Próbowałem też szablon, w komentarzu tutaj oddzielnie, a następnie zakomentowanie część łącza. Generuje to elementy wejściowe i łamiące, ale nie zakres, który pokazuje przykładowy plik wejściowy modelu.

Mam niepróbującą próbkę pod numerem http://jsfiddle.net/KvdM/nwbsT/, która to demonstruje.

Odpowiedz

15

Spróbuj tego:

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

Renderuje dane wyjściowe, ale nie działa {{sampleData}}. – XIII

+0

Jak mogę zarejestrować przykładData? – XIII

+3

{{sampleData}} nie działa, ponieważ napisałeś ng = model zamiast ng-model :) – AlwaysALearner

9

Uruchomienie funkcji zwróconej przez usługę $ compile daje elementy DOM zamiast html. Więc trzeba wstawić je do swojej strony za pomocą dołączania (lub jego odpowiednik):

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

który pokazuje już wejście, ale nie czyni {{}} sampleData pracy. – XIII

+0

Jak zastąpić zawartość elementu? To raczej dodaje. –

+1

prawdopodobnie po prostu zmienię "append" na "replaceWith" (nie próbowałem tego) –

1

Być może najprostszym sposobem jest użycie zakodowane szablon zamiast dynamiczny generowany jeden

<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

+0

Powoduje, że dane wejściowe stają się nieaktualne, ale aktualizacja {{sampleData}} nie jest aktualizowana. Pokazuje test. – XIII

+0

To są dane przekazywane w HTML. – zsong

-1

Zależy wha Rodzaj danych powinien być skompilowany, czasami Angular zwraca typ węzła komentarza.

Odpowiednim węzłem, którego chcemy użyć, jest next() (jego pierwsze siostrzeniec).

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(); 
}); 
-1

po prostu potrzebne, aby dodać jQuery używać „.html” i stała nazewnictwa NG-modelu

+0

Jak masz na myśli? Czy możesz podać jsfiddle lub odpowiedni przykład kodu? – XIII

Powiązane problemy