2015-02-07 20 views
8

Mam zbudować dyrektywę dla stronicowania, która pobiera dwa argumenty; bieżąca strona i łączna liczba stron.Załaduj dyrektywę po wywołaniu AJAX

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

Problem jest, że będę tylko znać wartość numberOfPages po wywołania AJAX (poprzez NG-zasobu). Ale moja dyrektywa jest już renderowana przed wykonaniem połączenia AJAX.

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; 
    }); 
}); 

Wolę poczekać z renderowaniem mojego szablonu kontrolerów do czasu zakończenia wywołania AJAX.

Plan B polegałby na dołączeniu szablonu do szablonu dyrektyw po zakończeniu wywołania AJAX.

Utknąłem opracowując oba scenariusze.

Odpowiedz

9

Trzeba czekać na wartości za pomocą $watch funkcji takich jak:

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

dyrektywę

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: Twój dyrektywa może używać samodzielnie zakres, ale nawet tak samo podstawa stoi.

+0

Dzięki. Nie wiedziałem o łączu (zamiast kontrolera). Myślę, że mogę ukryć dyrektywę za pomocą ng-hide i pokazać ją, gdy wartość się zmieni. Ale czy nie można zapobiec renderowaniu, dopóki wszystko nie zostanie zakończone? –

+0

Również; Mam działającą funkcję zegarka. Ale jak mogę ponownie renderować dyrektywę po wykryciu nowej zmiany? –

+1

Renderowanie nastąpi, gdy dane będą gotowe dopiero przed – Dalorzo

0

Jeśli używasz resolve z ui-router, można mieć meta lub meta.number_of_pages wstrzykiwany w kontrolerze zanim będzie za widok zostanie wygenerowana.

//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

Ale nie jest to możliwe, aby tylko zapobiec renderowania aż wszystko odbywa

  • myślę NG-jeśli to zrobi, w przeciwieństwie do NG-show/NG-hide, który właśnie zmień rzeczywisty wyświetlacz
+1

To również zadziałało :). Ale wolę zachować opóźnioną logikę renderowania wewnątrz kodu JS dyrektywy (zamiast HTML). –

+0

ng-if jest lepszym rozwiązaniem, ponieważ powinien być właścicielem dyrektywy (np. Html), aby zdecydować, czy go załadować. – OMGPOP

+0

Kolejne heads-up, łatwiej używać ng-if na elemencie HTML niż dodawać zakres. $ Watch funkcjonować. Miałem ten sam problem z ładowaniem dużego zestawu danych z ajax i potrzebowałem go przed renderowaniem mojej dyrektywy. Dzięki za wskazówkę! – Remiz