2013-10-09 29 views
43

HTMLNG-點擊不從動態生成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>' 
); 

角腳本

$scope.create = function() { 
     alert("Hi"); 
    }; 

這裏的F在AngularJS的控制器部分中調用的unction不會從ng-click事件觸發。 Html正在成功添加,但ng-click不起作用。告訴我解決方案使其工作

+1

您需要編譯angularjs的新dom元素才能正常工作......您是否在指令/控制器中執行此操作,您可以訪問範圍 –

+0

@ArunPJohny:正在從控制器調用該函數。但我應該在哪裏放置編譯功能?在一個指令? –

+0

我不知道確切的情況,但可以使用'ng-include'和模板做類似的事情。 – Chandermani

回答

38

不完美的修復,仍然!!! - 只是爲了證明編譯動態如何能做到

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操作 - 它必須與指令的幫助

+0

我已經試過這種方法,並沒有知道$編譯...所以試過它從jquery –

+1

@MaximShoustin:我們不應該使用控制器的DOM操作?有什麼理由? –

+4

@KiranKumar可用性,代碼清晰度,維護。控制器應該關注業務邏輯,而不是接口操作。 –

32

要使ng-click工作,我們需要編譯此源使用$compile服務。 Angular應該知道新生成的HTML,因此,爲了觸發ng-click和其他事件,這個HTML應該包含在摘要循環中。

Fiddle

創建 「compilator」:創建虛擬factory的,模擬追加

.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('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。

+0

我應該實現附加從指令的HTML而不是由jQuery做? –

+1

正如我在我的例子中顯示使用服務和添加控制器'$ scope.newTransaction = tempService();' –

+0

@KiranKumar添加小提琴讓你循環如何工作 –

3

我做需要Cordova在新窗口中打開動態鏈接,因此我的解決方案是在父元素上單擊ng並查看事件。目標看什麼點擊:

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

你需要添加$這裏編譯服務,將結合角指令像NG單擊控制器scope.Something這樣的:

var divTemplate = '..your div template'; 
var temp = $compile(divTemplate)($scope); 

然後將其附加到HTML:

angular.element(document.getElementById('foo')).append(temp); 

您還可以將事件到div綁定如下:

var div = angular.element("divID"); 
div.bind('click', $scope.addPhoto()); 
+0

如果您出於某種原因在服務內部添加HTML,將無法使用。 – trainoasis

10

可以使用angular.element(this).scope()不使用NG單擊

,改變

'<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>' 是好的

+0

短和工作(y) –

+0

我們可以做到這一點沒有範圍..我宣佈我的彈出式模板,同時在工廠中創建彈出。 – MobileEvangelist

+0

如何發送參數init? – Sana