2016-04-28 24 views
1

angular-datatablesプラグインを使用してプロジェクトにデータ型を追加しています。ここでは、私はいくつかのボタンを追加する列Actionsを持っています。このため、同じページに定義されているng-templateを使用しています。 問題は、テンプレートが常にレンダリングされるとは限りません。ボタンを表示することがあり、時には表示されないこともあります。私は検索を行った後、決してボタンを表示しません。レンダリングされていない角度データテーブルにテンプレートを含める

コントローラ

$scope.dtOptions = DTOptionsBuilder.newOptions().withOption('ajax', { 
     url: '/api/department', 
     type: 'GET' 
    }) 
    .withDataProp('data') 
    .withOption('processing', true) 
    .withOption('serverSide', true) 
    .withPaginationType('full_numbers') 
    .withOption('createdRow', function (row, data, dataIndex) { 
     // Recompiling so we can bind Angular directive to the DT 
     $compile(angular.element(row).contents())($scope); 
    }) 
    .withBootstrap(); 
$scope.dtColumns = [ 
    DTColumnBuilder.newColumn('id').withTitle('ID'), 
    DTColumnBuilder.newColumn('name').withTitle('Name'), 
    DTColumnBuilder.newColumn('actions').withTitle('Actions').withOption("searchable", false) 
]; 

<script type="text/ng-template" id="actions.html"> 
    <button class="btn btn-primary btn-xs" ng-click="edit()"><i class="fa fa-edit"></i> Edit</button> 
    <button class="btn btn-danger btn-xs" ng-click="delete()"><i class="fa fa-trash"></i> Delete</button> 
</script> 
<div class="hbox hbox-auto-xs hbox-auto-sm" ng-controller="DepartmentsController"> 
    <div class="bg-light lter b-b wrapper-md"> 
     <h1 class="m-n font-thin h3">Departments</h1> 
    </div> 
    <div class="wrapper-md"> 
     <div class="panel panel-default"> 
      <div class="panel-body"> 
       <div class="row"> 
        <div class="col-xs-6"> 
         <button class="btn m-b-md btn-md btn-primary " ui-sref="manager.departments.create"> 
          <i class="fa fa-plus"></i> <span class="hidden-sm hidden-xs">Add Department</span></button> 
        </div> 
       </div> 
       <div class="row"> 
        <div class="col-sm-12 m-b-xs"> 
         <table datatable="" dt-options="dtOptions" dt-columns="dtColumns" class="table table-striped b-t b-b"> 
          <thead> 
           <tr> 
            <th style="width:20%">ID</th> 
            <th style="width:60%">Name</th> 
            <th style="width:20%">Actions</th> 
           </tr> 
          </thead> 
         </table> 
        </div> 
       </div> 
      </div> 
     </div> 
    </div> 
</div> 

Laravelにおけるサーバ側制御

public function index() { 
    $departments = Department::company($this->company->id) 
      ->select("departments.id", "departments.name"); 

    return \Datatables::of($departments) 
      ->add_column("actions", function($row) { 
       return '<div ng-include src="\'actions.html\'"></div>'; 
      }) 
      ->make(true); 
} 

私はこれがいくつかの同期問題であると信じています。しかし、私はどこにも行きません。

答えて

1

正常に挿入されたテンプレートは本当に得られますか?私が$compile(angular.element(row).contents())($scope)を働かせる唯一の方法は、<table>が事前作成されているか、ng-repeatでレンダリングされている場合です。 - >http://plnkr.co/edit/UqZKhpgMx7aHCXdaNkiN?p=preview


私にとって

.withOption('createdRow', function (row, data, dataIndex) { 
    $scope.$apply($compile(angular.element(row).contents())($scope)) 
}) 

作品:遅れてここ

は、jQueryのAJAXからHTMLを注入されたが、私は$scope.$apply()の周りの唯一の方法だと思いますng-template含むバインディングを交換する必要があります

愚かな私。同じことは簡単な$timeoutで行うことができます。

http://plnkr.co/edit/5OTeHHUgkIurd6Z3DCkP?p=preview

+0

$timeout(function() { $compile(angular.element(row).contents())($scope) }) 
それが働きました。ありがとう!! $ scopeを実行すると、パフォーマンス上の問題が発生しますか? –

+0

@ShashankJain、あなたは歓迎です、答えを受け入れてくれてありがとう。しかし、私は一種の馬鹿でした。更新を参照してください。 '$ timeout'で十分でしょう。結局のところ、私たちが望むのは、後でダイジェストで '$ compile'が実行されることです。しかし、あなたの質問に答えるために、dataTableが初期化された後の単一の' $ apply'がパフォーマンスを引き起こすとは思いません問題はまったくありません。何度も何度も起動される '$ apply'は非常に悪いです。 – davidkonrad

+1

しかし、ここで$ scope。$ applyは各行の作成時に呼び出されます。したがって、テーブルに50行があると、これは50回呼び出されます。 –

関連する問題