angularjsng-bind-htmlsorttable.js

How to make a table sort-able while the whole components is passed as string via ng-bind-html in AngluarJS


Hi I have a situation in AngluarJS that the HTML is generated by back-end and the only thing that front-end should do is to put the HTML which is mostly table tags into the ng-bind-html and show it to the user. But now these tables should be sort-able too. How can I do it?

The thing that I've already done is to create my own directive using this so make the static string HTML take some actions too. But having them sorted is something else. In other word I want to make my fully generated table with all <tr> and <td> to get sorted by my actions.

Here is my simplified code (compile is my directive):

JS:
// The string is fully generated by back-end
$scope.data.html = 
'<table> <tr> <th ng-click="sortByHeader($event)"> Name </th> 
              <th ng-click="sortByHeader($event)"> Age </th> </tr>
              <tr> <td> Sara </td> <td> 15 </td> </tr>
              <tr> <td> David </td> <td> 20 </td> </tr>'

HTML: 
<div compile="data.html"></div>

The ng-click="sortByHeader($event) is something that back-end can prepare for me so I can use it thanks to the compile I wrote that let me find out which header has been clicked. Other than that there is nothing I can do. Unless you can help me :D

Thanks in advance, I hope my question was clear.


Solution

  • Since you tagged your question with sorttable.js I'm going to assume that you are using that script to sort your tables. Now, if I understand it correctly, sorttable.js parses your HTML for any tables with the class sortable. Your table is apparently loaded dynamically, therefore sorttable.js does not know about it when it parses the HTML.

    But you can tell it to make a dynamically added table sortable, too.

    Relevant part taken from the following page: https://kryogenix.org/code/browser/sorttable/#ajaxtables

    Sorting a table added after page load

    Once you've added a new table to the page at runtime (for example, by doing an Ajax request to get the content, or by dynamically creating it with JavaScript), get a reference to it (possibly with var newTableObject = document.getElementById(idOfTheTableIJustAdded) or similar), then do this:

    sorttable.makeSortable(newTableObject);

    You should be able to do that with angular. If not, I can try to put something together later.