6

Tôi đang cố viết một chỉ thị sẽ tạo ra một lưới. Mã sau hoạt động nhưng tôi phải chỉ định tên bộ điều khiển 'DemoCtrl'. Có thể lấy tên bộ điều khiển hiện tại từ bên trong chỉ thị để tôi có thể chuyển nó qua các hàm buildColumn/buildRows không?Nhận Tên Bộ điều khiển Hiện tại trong AngularJS

angular.module('app').controller('DemoCtrl', function ($scope) { 
 
    $scope.controller = "DemoCtrl"; 
 
    $scope.coldata = [ 
 
     {name: 'Account'}, 
 
     {name: 'Name'} 
 
    ]; 
 
    $scope.rowdata = [ 
 
     { 
 
      "account": "ABC", 
 
      "name": "Jim", 
 
     }, 
 
     { 
 
      "account": "DEF", 
 
      "name": "Joe", 
 
     }, 
 
     { 
 
      "account": "GHI", 
 
      "name": "Fred", 
 
     } 
 
    ]; 
 
}); 
 

 
angular.module('foxy.components.grid', []) 
 

 
     .controller('GridController', ['$scope', '$attrs', function ($scope, $attrs) { 
 
      }]) 
 

 
     .directive('grid', function ($compile) { 
 
      return { 
 
       restrict: 'EA', 
 
       controller: 'GridController', 
 
       require: "^ngController", 
 
       scope: { 
 
        data: "=", 
 
        columns: "=", 
 
        controller: "=" 
 
       }, 
 
       link: function (scope, element, attrs, ctrl) { 
 
        scope.$watch('data', function() { 
 
         var el = $compile(buildGrid(scope.controller))(scope); 
 
         element.replaceWith(el); 
 
         element = el; 
 
        }); 
 

 
       } 
 
      }; 
 
     }) 
 

 
function buildGrid(controller) { 
 
    var html = "<table>"; 
 

 
    html += "<thead>"; 
 
    html += buildColumn(controller); 
 
    html += "</thead>"; 
 

 
    html += "<tbody>"; 
 
    html += buildRows(controller); 
 
    html +="</body>"; 
 

 
    html += "</table>"; 
 

 
    return html; 
 
} 
 
function buildColumn(controller) { 
 
    try { 
 
     var html = ""; 
 
     var dom_el = document.querySelector('[ng-controller="' + controller + '"]'); 
 
     var ng_el = angular.element(dom_el); 
 
     var ng_el_scope = ng_el.scope(); 
 
     var colname = ng_el_scope.coldata; 
 

 
     html += "<tr>"; 
 

 
     for (i = 0; i < colname.length; i++) { 
 
      html += "<th>"; 
 
      html += colname[i]["name"]; 
 
      html += "</th>"; 
 
     } 
 

 
     html += "</tr>"; 
 

 
     return html; 
 
    } catch (err) { 
 
     return "#error" + err; 
 
    } 
 
} 
 

 
function buildRows(controller) { 
 
    try { 
 
     var html = ""; 
 
     var dom_el = document.querySelector('[ng-controller="' + controller + '"]'); 
 
     var ng_el = angular.element(dom_el); 
 
     var ng_el_scope = ng_el.scope(); 
 
     var colname = ng_el_scope.coldata; 
 
     var rows = ng_el_scope.rowdata; 
 

 
     for (j = 0; j < rows.length; j++) { 
 
      html += "<tr>"; 
 

 
      for (data in rows[j]) { 
 
       html += "<td>"; 
 
       html += rows[j][data]; 
 
       html += "</td>"; 
 
      } 
 

 
      html += "</tr>"; 
 
     } 
 

 
     return html; 
 
    } catch (err) { 
 
     return "#error" + err; 
 
    } 
 
}

+1

Hoàn toàn không liên quan đến vấn đề của bạn, nhưng bạn nên kiểm tra toán tử '+ ='. – m90

Trả lời

2

Bạn có thể sử dụng dịch vụ tuyến đường của bạn để có được tên điều khiển

{{$route.current.scope.name}} 
+3

Dường như nó phải là '$ route.current.controller' – Max

1

Tôi đã cập nhật mã của tôi với giải pháp của tôi, tôi quyết định tạo ra một biến phạm vi mới với tên bộ điều khiển được chuyển tới hàm buildGrid. Không lý tưởng, nhưng nó hoạt động!

Các vấn đề liên quan