HTML
<table data-ng-table="tableParams" class="table table-bordered table-hover " style="border-collapse:collapse" data-ng-init="host.editSave = false" >
<tr id="newTransaction">
</tr>
<tr data-ng-repeat="host in hosts|filter:search:strict" >
<td class="hostTableCols" data-ng-hide="host.editSave">{{host.hostCd}}</td>
<td class="hostTableCols" data-ng-hide="host.editSave">{{host.hostName}}</td>
</tr>
</table>
Jquery
$('#newTransaction').append(
'<td contenteditable><input type="text" class="editBox" value=""/></td>'+
'<td contenteditable><input type="text" class="editBox" value=""/></td>'+
'<td>'+
'<span>'+
'<button id="createHost" class="btn btn-mini btn-success" data-ng-click="create()"><b>Create</b></button>'+
'</span>'+
'</td>'
);
Hoekig schrift
$scope.create = function() {
alert("Hi");
};
Hier wordt de functie die wordt aangeroepen in het controllergedeelte van de AngularJS niet geactiveerd door de ng-click-gebeurtenis. De Html wordt met succes toegevoegd, maar de ng-click werkt niet. Vertel me oplossingen om het te laten werken
Antwoord 1, autoriteit 100%
Nog geen perfecte oplossing!!! – gewoon om te laten zien hoe dynamische compilatie kan worden gedaan
app.controller('AppController', function ($scope, $compile) {
var $el = $('<td contenteditable><input type="text" class="editBox" value=""/></td>' +
'<td contenteditable><input type="text" class="editBox" value=""/></td>' +
'<td>' +
'<span>' +
'<button id="createHost" class="btn btn-mini btn-success" data-ng-click="create()"><b>Create</b></button>' +
'</span>' +
'</td>').appendTo('#newTransaction');
$compile($el)($scope);
$scope.create = function(){
console.log('clicked')
}
})
Demo: Fiddle
Gebruik de controller niet voor dom-manipulatie – het moet worden gedaan met behulp van richtlijnen
Antwoord 2, autoriteit 72%
Om ng-click
te laten werken, moeten we deze bron compilerenmet behulp van de service $compile
. Angular moet op de hoogte zijn van nieuw gegenereerde HTML en daarom moet deze HTML worden opgenomen in de digest-cyclus om ng-click
en andere gebeurtenissen te activeren.
Zie Fiddle
Maak “compilator”:
.directive( 'compileData', function ( $compile ) {
return {
scope: true,
link: function ( scope, element, attrs ) {
var elmnt;
attrs.$observe( 'template', function ( myTemplate ) {
if ( angular.isDefined( myTemplate ) ) {
// compile the provided template against the current scope
elmnt = $compile( myTemplate )( scope );
element.html(""); // dummy "clear"
element.append( elmnt );
}
});
}
};
});
maak daarna een dummy factory
die uw toevoegingsimuleert:
.factory( 'tempService', function () {
return function () {
return '<td contenteditable><input type="text" class="editBox" value=""/></td>'+
'<td contenteditable><input type="text" class="editBox" value=""/></td>'+
'<td>'+
'<span>'+
'<button id="createHost" class="btn btn-mini btn-success" data-ng-click="create()"><b>Create</b></button>'+
'</span>'+
'</td>';
};
});
En noem het ten slotte zo:
<div compile-data template="{{mainPage}}"></div>
in controller:
$scope.newTransaction= tempService();
Uw voorbeeld zou zoiets moeten zijn als:
<table data-ng-table="tableParams" class="table table-bordered table-hover " style="border-collapse:collapse" data-ng-init="host.editSave = false" >
<tr compile-data template="{{newTransaction}}">
</tr>
<tr data-ng-repeat="host in hosts|filter:search:strict" >
<td class="hostTableCols" data-ng-hide="host.editSave">{{host.hostCd}}</td>
<td class="hostTableCols" data-ng-hide="host.editSave">{{host.hostName}}</td>
</tr>
</table>
BTW, voorlopig kun je dezelfde instructie over je code gebruiken en elke dynamische HTML compileren.
Antwoord 3, autoriteit 48%
u kunt angular.element(this).scope()
gebruiken zonder ng-click
en wijzigen
'<button id="createHost" class="btn btn-mini btn-success" data-ng-click="create()"><b>Create</b></button>'
Naar
'<button id="createHost" class="btn btn-mini btn-success" onclick="angular.element(this).scope().create()"><b>Create</b></button>'
is goed
Antwoord 4, autoriteit 6%
Ik moest Cordova de dynamische link in een nieuw venster laten openen, dus mijn oplossing was om de ng-klik op het bovenliggende element te plaatsen en naar het event.target te kijken om te zien waar op werd geklikt:
<p ng-bind-html="foo.barhtml" ng-click="generalClick($event)"></p>
dan
.controller('FooCtrl', function ($scope) {
var html = '<a href="http://www.google.com">google.com</a>';
$scope.foo.barhtml = html.replace(/href/g, 'data-href');
$scope.generalClick = function(event){
// have Cordova open the link in a browser window
window.open(event.target.attributes['data-href'].value, '_system');
}
})
Antwoord 5, autoriteit 4%
je moet hier $compile-service toevoegen, die de hoekige richtlijnen zoals ng-click aan je controllerbereik bindt. Zoiets als:
var divTemplate = '..your div template';
var temp = $compile(divTemplate)($scope);
Voeg het dan toe aan de HTML:
angular.element(document.getElementById('foo')).append(temp);
Je kunt de gebeurtenis ook als volgt aan de div binden:
var div = angular.element("divID");
div.bind('click', $scope.addPhoto());