0

I am trying to implement inline editing on datatables in AngularJS. I was trying to find some example but i couldn't. There is a good example here, but it is not compatible with AngularJS. So, how can i implement it in AngularJS?

Related code from my project:

<tbody>
    <tr ng-repeat="meal in meals">
        <td>{{ meal.id }}</td>
        <td>{{ meal.name }}</td>
        <td>
            <a ng-click="open_yemek('lg', meal.name, meal.recipe, meal.ingredients)">Tıklayın</a>
        </td>
        <td class="text-center">
            <!--<small class="label label-warning" style="font-size: 9px !important;"><i class="fa fa-clock-o"></i> {{ yemek.sure }}</small>-->
            {{ meal.time }}
        </td>
        <td>{{ meal.category }}</td>
        <td>{{ meal.region }}</td>
        <td>{{ meal.user }}</td>
        <td class="text-center">{{ meal.rank }}/10</td>
        <td>{{ meal.status }}</td>
        <td>
            <i ng-click="editItem($index)" class="fa fa-pencil-square-o" aria-hidden="true"></i>
            <a ng-click="removeItem('yemekler',$index)"><i class="fa fa-trash-o" aria-hidden="true"></i></a>
            <a ng-click="addItem('yemekler')"><i aria-hidden="true" class="fa fa-plus"></i></a>
        </td>
    </tr>
</tbody>

This is the JS:

$scope.dtOptions = DTOptionsBuilder.newOptions()
    .withOption('lengthMenu', [5, 10, 15])
    .withOption('autoWidth', true);

$scope.meals = {};

mealFactory.get()
    .success(function(data) {
        console.log(data);
        $scope.meals = data;
    });

the image

1 Answer 1

1

My suggestion here is to use an ng-include with <input> tags inside the td element. This way, you will be able to have a "readonly" td and an editable one with a single click on it.

Your HTML code of your table should be something like this:

<tbody>
   <tr ng-repeat="row in data track by $index"> 
      <td> </td>
      <td ng-click="makeEditable($index)" ng-include="{{row.isEditable ? 'editableInput.html' : 'readonly.html'}}"> </td>
      <td> </td>
   </tr>
</tbody>

With the use of some templates:

<script type="text/ng-template" id="editableInput.html">
     <input type="text" ng-model="row.value"></input>
</script>

<script type="text/ng-template" id="readonly.html">
     <span>{{row.value}}</span>
</script>

And in your controller, the click listener:

$scope.makeEditable = function($index){
   //remove every previous editable input...
   if($scope.lastDataEditable != null)
      $scope.lastDataEditable = false;

   $scope.data[$index].isEditable = true;
   $scope.lastDataEditable = $scope.data[$index];
}

Beware: you haven't provided any form of code, and your question is a bit too general. I provided you a general idea of you should do.

In fact, you should also consider to use a directive for the same purpose: it all dipends of the complexity of your environment.

Sign up to request clarification or add additional context in comments.

3 Comments

I was try to change my code with your advices but i couldn't so i added my form of code.
The JS code is added. The displayed data is retrieving from database.
You aren't using ng-include properly. please see my answer on how to use it.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.