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>'
);
Angular Script
$scope.create = function() {
alert("Hi");
};
此处AngularJS的控制器部分中调用的函数未从ng-click事件获取触发器。 Html成功附加,但ng-click无法正常工作。告诉我解决方案,让它工作
答案 0 :(得分:47)
不是一个完美的修复,仍然! - 只是为了说明如何进行动态编译
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')
}
})
演示:Fiddle
不要使用控制器进行dom操作 - 必须在指令的帮助下完成
答案 1 :(得分:36)
要使ng-click
正常工作,我们需要使用$compile
服务编译此来源。 Angular应该知道新生成的HTML,因此应该将此HTML包含在摘要周期中,以便触发ng-click
和其他事件。
参见 Fiddle
创建“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 );
}
});
}
};
});
之后,创建模拟追加的虚拟factory
:
.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>';
};
});
最后称之为:
<div compile-data template="{{mainPage}}"></div>
控制器中的:
$scope.newTransaction= tempService();
您的示例应该是:
<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,现在你可以在代码上使用相同的指令并编译任何动态HTML。
答案 2 :(得分:20)
您可以在不使用ng-click
的情况下使用angular.element(this).scope()
并更改
'<button id="createHost" class="btn btn-mini btn-success" data-ng-click="create()"><b>Create</b></button>'
到
'<button id="createHost" class="btn btn-mini btn-success" onclick="angular.element(this).scope().create()"><b>Create</b></button>'
很好
答案 3 :(得分:3)
我需要让Cordova在新窗口中打开动态链接,所以我的解决方案是将ng-click放在父元素上,然后查看event.target以查看点击的内容:
<p ng-bind-html="foo.barhtml" ng-click="generalClick($event)"></p>
然后
.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');
}
})
答案 4 :(得分:2)
你需要在这里添加$ compile服务,它会将像ng-click这样的angular指令绑定到你的控制器范围。如:
.showastext{
text-decoration: none;
cursor: text;
color: black;
}
然后将其附加到HTML:
var divTemplate = '..your div template';
var temp = $compile(divTemplate)($scope);
您还可以将事件绑定到div,如下所示:
angular.element(document.getElementById('foo')).append(temp);