2

我有这个指令:

app.directive('changemonth', function($animator) {
    return {
      link : function($scope, element, attrs) {
        element.bind("click", function() {

          if(element.attr('class').search('disabled') == -1) {

            // récupération du calendrier :
            if(element.attr('class').search('day') != -1)
              var calendar = angular.element(element.parent().parent());
            else                                         
              var calendar = angular.element(element.parent().parent().next().children()[1]);
            var animator = $animator($scope, attrs);

            animator.hide(calendar); 
            setTimeout(function() { 
              $scope.$apply(attrs.changemonth);
              animator.show(calendar); 
            }, 500);
          }
        });
      }
    };
});

attrs.changemonth,我调用一个函数(可以改变),例如这个:

$scope.next = function() {
        var tmpMonth = $scope.monthsLabels.indexOf($scope.monthDisplayed) + 1;
        var tmpYear = $scope.yearDisplayed;
        if(tmpMonth==12) {
            tmpMonth = 0;
            tmpYear = parseInt($scope.yearDisplayed) + 1;
        }
        getCalendar(tmpMonth, tmpYear);
        $scope.monthDisplayed = $scope.monthsLabels[tmpMonth];
        $scope.yearDisplayed = tmpYear.toString();
    };

所以这个函数调用另一个getCalendar()你可以在这里看到:

function getCalendar(month, year) {
        $http({
            method : "GET", 
            url : 'http://my_url/getCalendar', 
            params : { 
                group_id : $scope.group_id,
                month : month,
                year : year
            }
        })
        .success(function(data) {
            $scope.calendar = data;
        });
    }

getCalendar()用于$http从数据库中获取日历。

我的问题是我想在指令中使用 animator 之前等待响应$http,像这样,只有在加载内容时才会显示我的日历。

我听说$q并承诺。但我不知道如何在这种非常特殊的情况下使用它。

如果这里有人有想法,那就太棒了。

4

2 回答 2

4

尝试像这样从您的成功回调中广播。

.success(function(data) {
    $scope.calendar = data;
    $rootScope.$broadcast('event:calendar-received');
});

然后在您的指令中,您可以等待接收这样的信号。

$scope.$on('event:calendar-received', function() {
    ... do your stuff with animator...
});
于 2013-08-02T15:35:34.137 回答
0

$http(...)评估为一个承诺。这意味着给定

var x = $http(...)

你可以做

x.then(function success(){...}, function failure(){...});

并且successorfailure函数只会在 promise 被解决时被调用。请参阅承诺API

你的函数可以返回 thisx并且它们的调用函数可以作为一个 Promise 与之交互。

于 2013-08-02T13:47:51.830 回答