2014-06-09 17 views
7

Tôi có dịch vụ sẽ trả lại một số tùy chọn cấu hình cho ng-grid. Hàm getGridOptions lấy tên của bộ điều khiển nó được sử dụng và trả về một tập hợp các tùy chọn đúng (chỉ có một tùy chọn được hiển thị ở đây cho ngắn gọn).Điều khiển trong Ngắt góc khi tùy chọn cấu hình đến từ dịch vụ

dịch vụ cho các tùy chọn ng-lưới:

angular.module('services').service('GridOptionsService',function(){ 

    var documents = { 
     data: 'myData', 
     enablePaging: true, 
     showFooter:true, 
     totalServerItems: 'totalServerItems', 
     pagingOptions: { 
      pageSizes: [50,100,200], 
      pageSize: 50, 
      currentPage: 1 
     }, 
     filterOptions: { 
      filterText: '', 
      useExternalFilter: false 
     }, 
     enableCellEdit: false, 
     enableColumnReordering: true, 
     enablePinning: false, 
     showGroupPanel: false, 
     groupsCollapsedByDefault: true, 
     enableColumnResize: true, 
     showSelectionCheckbox: true, 
     selectWithCheckboxOnly: true, 
     columnDefs: [ 
      {field:'docId', displayName:'Document ID', cellTemplate: NgGridDomUtil.toLink('#/documents/{{row.getProperty(col.field)}}')}, 
      {field:'docTags', displayName:'Tags'}, 
      {field:'lastSaveDate', displayName:'Last saved'}, 
      {field:'documentVersion', displayName:'Version', width: 120}, 
      {field:'busDocId', displayName:'Customer Doc ID'}, 
      {field:'markedForDelete', displayName:'Deleted', width: 120, cellTemplate: NgGridDomUtil.toCheckbox('{{row.getProperty(col.field)}}')}] 
    }; 

    var gridOptionManager = { 
     documents: documents 

    } 
    return { 
     getGridOptions: function(controllerName){ 
      return gridOptionManager[controllerName]; 
     } 

    } 
}) 

Lớp NgGridDomUtil chỉ làm cho nó dễ dàng hơn để tạo kiểu những thứ trên lưới:

var NgGridDomUtil = (function(){ 
    var toLink = function(href){ 
    var html = '<div class="ngCellText" ng-class="col.colIndex()"><a ng-href= "'+href+'" class="ngCellLink"><span ng-cell-text>{{row.getProperty(col.field)}}</span></a></div>' 
    return html; 
} 
var toCheckbox = function(_selected){ 
    var html = '<div class="ngCellText" ng-class="col.colIndex()"><input type="checkbox" ng-change="console.log('+"TEST"+')" ng-model="COL_FIELD" ng-input="COL_FIELD"' + (_selected ? 'selected' : '') + ' /></div>' 
    return html 
} 
return { 
    toLink: toLink, 
    toCheckbox: toCheckbox 
} 
})(); 

Vấn đề của tôi là gì khi tôi sử dụng GridOptionsService để lấy dữ liệu, dữ liệu vẫn được hiển thị chính xác trên lưới, nhưng việc lọc văn bản không còn hoạt động nữa và phân trang bị hỏng. Tuy nhiên, selectedFilterOption vẫn hoạt động.

điều khiển:

angular.module('controllers').controller('Repository', ['$scope', 'DataContext','GridOptionsService','$http', function($scope, DataContext,GridOptionsService,$http) { 
    $scope.filterOptions = { 
     filterText: '', 
     useExternalFilter: false 
    }; 
    $scope.totalServerItems =0; 
    $scope.pagingOptions ={ 
     pageSizes: [5,10,100], 
     pageSize: 5, 
     currentPage: 1 
    } 
    //filter! 
    $scope.dropdownOptions = [{ 
     name: 'Show all' 

    },{ 
     name: 'Show active' 
    },{ 
     name: 'Show trash' 
    }]; 
    //default choice for filtering is 'show active' 
    $scope.selectedFilterOption = $scope.dropdownOptions[1]; 


    //three stage bool filter 
    $scope.customFilter = function(data){ 
     var tempData = []; 
     angular.forEach(data,function(item){ 
      if($scope.selectedFilterOption.name === 'Show all'){ 
       tempData.push(item); 
      } 
      else if($scope.selectedFilterOption.name ==='Show active' && !item.markedForDelete){ 
       tempData.push(item); 
      } 
      else if($scope.selectedFilterOption.name ==='Show trash' && item.markedForDelete){ 
       tempData.push(item); 
      } 
     }); 
     return tempData; 
    } 



    //grabbing data 
    $scope.getPagedDataAsync = function(pageSize, page, searchText){ 
     var data; 
     if(searchText){ 
      var ft = searchText.toLowerCase(); 
      DataContext.getDocuments().success(function(largeLoad){ 
       //filter the data when searching 
       data = $scope.customFilter(largeLoad).filter(function(item){ 
        return JSON.stringify(item).toLowerCase().indexOf(ft) != -1; 
       }) 
       $scope.setPagingData($scope.customFilter(data),page,pageSize); 
      }) 
     } 
     else{ 
      DataContext.getDocuments().success(function(largeLoad){ 
       var testLargeLoad = $scope.customFilter(largeLoad); 
       //filter the data on initial page load when no search text has been entered 
       $scope.setPagingData(testLargeLoad,page,pageSize); 
      }) 
     } 
    }; 
    //paging 
    $scope.setPagingData = function(data, page, pageSize){ 
     var pagedData = data.slice((page -1) * pageSize, page * pageSize); 
     //filter the data for paging 
     $scope.myData = $scope.customFilter(pagedData); 
     $scope.myData = pagedData; 
     $scope.totalServerItems = data.length; 
//  if(!$scope.$$phase){ 
//   $scope.$apply(); 
//  } 
    } 

    //watch for filter option change, set the data property of gridOptions to the newly filtered data 
    $scope.$watch('selectedFilterOption',function(){ 
     var data = $scope.customFilter($scope.myData); 
     $scope.myData = data; 
     $scope.getPagedDataAsync($scope.pagingOptions.pageSize, $scope.pagingOptions.currentPage); 
     $scope.setPagingData($scope.myData,$scope.pagingOptions.currentPage,$scope.pagingOptions.pageSize); 
    }) 
    $scope.$watch('pagingOptions',function(newVal, oldVal){ 
     $scope.getPagedDataAsync($scope.pagingOptions.pageSize,$scope.pagingOptions.currentPage,$scope.filterOptions.filterText); 
     $scope.setPagingData($scope.myData,$scope.pagingOptions.currentPage,$scope.pagingOptions.pageSize); 
    },true) 


    $scope.message ="This is a message"; 
    $scope.gridOptions = { 
     data: 'myData', 
     enablePaging: true, 
     showFooter:true, 
     totalServerItems: 'totalServerItems', 
     pagingOptions: $scope.pagingOptions, 
     filterOptions: $scope.filterOptions, 
     enableCellEdit: true, 
     enableColumnReordering: true, 
     enablePinning: true, 
     showGroupPanel: true, 
     groupsCollapsedByDefault: true, 
     enableColumnResize: true 
    } 
    $scope.gridOptions = GridOptionsService.getGridOptions('documents'); 
    //get the data on page load 
    $scope.getPagedDataAsync($scope.pagingOptions.pageSize, $scope.pagingOptions.currentPage); 
}]); 

Các tùy chọn lưới mà tôi đã cứng mã hóa vào bộ điều khiển cũng giống như những người trở về từ các dịch vụ. Những gì tôi không hiểu là lý do tại sao lưới render, bộ lọc thả xuống hoạt động, nhưng phân trang bị hỏng, chỉ khi các tùy chọn cho lưới đến từ một dịch vụ? Nhưng nó hoạt động như mong đợi nếu nó được mã hóa cứng vào bộ điều khiển.

EDIT: Nếu ai đó có thể nêu rõ hơn về vấn đề của tôi, vui lòng chỉnh sửa tiêu đề.

Trả lời

3

Tôi thực sự không biết cách ngGrid được triển khai như thế nào, nhưng một lỗi phổ biến mà tôi biết tồn tại trong nhiều chỉ thị là họ mong đợi cấu hình của họ sẵn sàng ngay khi chúng được khởi tạo. Nghĩa là thay vì xem đối tượng cấu hình, chúng giả sử nó tồn tại và sử dụng nó trực tiếp trong các hàm liên kết \ controller chạy ngay khi chúng được tạo ra.

Nếu đây thực sự là trường hợp, giải pháp khắc phục nhanh cho sự cố là khởi tạo chỉ thị khi bạn có đối tượng cấu hình. Giả sử bạn chuyển đối tượng cấu hình thông qua biến 'tùy chọn' trên phạm vi của bạn, sau đó bạn sẽ viết một cái gì đó như:

<!-- If options exists on your scope, it means you fetched it from the server --> 
<div ng-if="options"> 
    <div ng-grid ng-grid-options="options"></div> 
</div> 

Một lần nữa, tôi không quen với ngGrid hoặc cách sử dụng của nó, đây chỉ là một dự đoán có giáo dục, đưa ra kết luận và áp dụng chúng trên API chính xác.

+0

đó là một đoán tốt, nhưng không hoạt động trong trường hợp của tôi. Đã học được một chút, mặc dù :) – wootscootinboogie

2

Tôi chưa thử nghiệm điều này, nhưng một vấn đề có thể xảy ra là bạn đang ghi đè lên một đối tượng nằm trong phạm vi $. Điều này có thể phá vỡ hai cách ràng buộc. Để thử nghiệm nhanh, hãy thử

$scope.grid = { 
     Options: { 
      data: 'myData', 
      enablePaging: true, 
      showFooter:true, 
      totalServerItems: 'totalServerItems', 
      pagingOptions: $scope.pagingOptions, 
      filterOptions: $scope.filterOptions, 
      enableCellEdit: true, 
      enableColumnReordering: true, 
      enablePinning: true, 
      showGroupPanel: true, 
      groupsCollapsedByDefault: true, 
      enableColumnResize: true 
     } 
    } 
    $scope.grid.Options = GridOptionsService.getGridOptions('documents'); 

Bạn cũng cần cập nhật tùy chọn lưới trong thuộc tính chỉ thị.

1

Vấn đề là các chức năng điều khiển để lọc và phân trang sử dụng các tùy chọn được xác định trên bộ điều khiển $scope, nhưng giao diện ng lưới không bị ràng buộc với các đối tượng đó.

Các phương pháp điều khiển để lọc và phân trang sử dụng $scope.pagingOptions làm nguồn dữ liệu. Tuy nhiên, giao diện người dùng ng lưới được ràng buộc với $scope.gridOptions.pagingOptions. Khi bạn tạo $scope.gridOptions một cách rõ ràng trong bộ điều khiển, $scope.gridOptions.pagingOptions đề cập đến cùng một đối tượng như $scope.gridOptions, do đó, việc thực hiện thay đổi trong giao diện người dùng sẽ thay đổi giá trị được sử dụng trong các chức năng của bộ điều khiển.

Tuy nhiên, khi $scope.gridOptions được chỉ định sử dụng dịch vụ, dịch vụ sẽ tạo mới pagingOptions, do đó không có kết nối giữa $scope.gridOptions.pagingOptions$scope.pagingOptions. Thực hiện các thay đổi trong giao diện người dùng sẽ không thay đổi các giá trị được sử dụng trong các chức năng của bộ điều khiển.

Điều này cũng đúng cho filterOptions.

Một cách để giải quyết vấn đề là

$scope.gridOptions = GridOptionsService.getGridOptions('documents'); 
$scope.pagingOptions = $scope.gridOptions.pagingOptions 
$scope.filterOptions = $scope.gridOptions.filterOptions 
Các vấn đề liên quan