2015-02-07 16 views
8

Tôi đã xây dựng một chỉ thị cho phân trang có hai đối số; trang hiện tại và tổng số trang.Chỉ thị tải sau khi gọi AJAX

<pagination page="page" number-of-pages="numberOfPages"></pagination>

Vấn đề là tôi sẽ chỉ biết giá trị của numberOfPages sau khi một cuộc gọi AJAX (qua ng tài nguyên). Nhưng chỉ thị của tôi đã được trả trước khi cuộc gọi AJAX được thực hiện.

app.controller('MyController', function ($scope, $routeParams) { 
    $scope.page = +$routeParams.page || 1, 
    $scope.numberOfPages = 23; // This will work just fine 

    MyResource.query({ 
     "page": $scope.page, 
     "per_page": 100 
    }, function (response) { 
     //This won't work since the directive is already rendered 
     $scope.numberOfPages = response.meta.number_of_pages; 
    }); 
}); 

Tôi thích chờ kết xuất mẫu bộ điều khiển cho đến khi cuộc gọi AJAX kết thúc.

Gói B sẽ thêm mẫu với mẫu chỉ thị khi thực hiện cuộc gọi AJAX.

Tôi gặp khó khăn khi làm việc cả hai trường hợp.

Trả lời

9

Bạn phải đợi cho giá trị sử dụng một $watch chức năng như:

<div before-today="old" watch-me="numberOfPages" >{{exampleDate}}</div> 

Chỉ

angular.module('myApp').directive('myPagingDirective', [ 
    function() { 
    return { 
     restrict: 'A', 
     link: function (scope, element, attr) { 


     scope.$watch(attr.watchMe,function(newValue,oldValue){ 
       //check new value to be what you expect. 
      if (newValue){   
        // your code goes here 
      } 
     }); 
     } 
    }; 
    } 
]); 

imporant: Chỉ thị của bạn có thể sử dụng một phạm vi riêng biệt nhưng ngay cả như vậy cùng nguyên tắc là viết tắt.

+0

Cảm ơn. Tôi không biết về liên kết (thay vì điều khiển). Tôi nghĩ rằng có thể ẩn chỉ thị bằng ng-hide và hiển thị nó khi giá trị thay đổi. Nhưng không phải là nó có thể chỉ ngăn chặn rendering cho đến khi tất cả được thực hiện? –

+0

Ngoài ra; Tôi đã nhận được chức năng đồng hồ. Nhưng làm thế nào tôi có thể tái xuất hiện chỉ thị khi phát hiện thay đổi mới? –

+1

Việc hiển thị sẽ xảy ra khi dữ liệu đã sẵn sàng không trước – Dalorzo

0

Nếu bạn sử dụng resolve từ ui-router, bạn có thể có meta hoặc meta.number_of_pages tiêm trong điều khiển của bạn TRƯỚC xem nó được kết xuất.

//routes.js 
angular.module('app') 
    .state('some_route', { 
    url: '/some_route', 
    controller: 'MyController', 
    resolve: { 
     meta: ['MyResource', function (MyResource) { 
     return MyResource.query({ 
      "page": $scope.page, 
      "per_page": 100 
     }, function (response) { 
      return response.meta; 
     }); 
     }] 
    } 
    }); 

//controllers.js 
app.controller('MyController', function ($scope, $routeParams, meta) { 
    $scope.page = +$routeParams.page || 1, 
    $scope.numberOfPages = meta.number_of_pages; 
}); 
13

Nhưng không phải là nó có thể chỉ ngăn chặn sự vẽ cho đến khi tất cả được thực hiện

  • Tôi nghĩ rằng ng-nếu có thể làm điều đó, trái với ng-show/ng-hide mà chỉ thay đổi hiển thị thực tế
+1

Điều này cũng hiệu quả :). Nhưng tôi thích giữ logic hiển thị bị trì hoãn bên trong mã JS của chỉ thị (thay vì HTML). –

+0

ng-if là một giải pháp tốt hơn vì nó phải là chủ sở hữu của chỉ thị (tức là html) để quyết định có tải nó – OMGPOP

+0

Thủ tục khác hay không, việc sử dụng ng-if trên phần tử html của bạn dễ dàng hơn việc thêm một phạm vi. chức năng. Tôi đã có cùng một vấn đề của một tập dữ liệu lớn được nạp từ ajax và cần nó trước khi đưa ra chỉ thị của tôi. Cảm ơn vì tiền hỗ trợ! – Remiz

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