2014-11-11 8 views
0

У меня есть метод, который контроллер инициализации инициализации автозавершения ввода в шаблоне:Как реорганизовать Угловое обещание обратного вызова?

$scope.initAutoCompleteForWorkers = function (id) { 
     // INIT AUTOCOMPLETE FOR WORKERS 
     var promise = GlobalHelperService.workersListForAutocomplete(); 
     promise.then(
      function(answer) { 
       // do something 
       console.log("Answer"); 
       console.log(answer); 
       console.log("Name" + answer.name); 
       console.log("Surname" + answer.surname); 
       //$scope.projectDetail.newWorker = ""; 
       //$scope.projectDetail.newWorkerName = ""; 
       $scope.projectDetail.newWorker = answer; 
       $scope.projectDetail.newWorkerName = answer.name +" "+answer.surname ; 
      }, 
      function(error) { 
       // report something 
       console.log("Error"); 
       console.log("Processing error with status " +status); 
       growlNotifications.add($translate.instant('PROCESSING_REQUEST_ERROR') + jsonResponse.message , 'error', $rootScope.notificationLifetime); 
      }, 
      function(progress) { 
       // report progress 
       console.log("Progres"); 
      }); 
    }; 

Это метод инициализации, который должен возвращен deffered.resolve после каждого выбора события.

this.workersListForAutocomplete = function (container, options) { 
     var deferred = $q.defer(); 
     $("#autocompleteWorker").kendoAutoComplete({ 
      dataSource : { 
       type: "json", 
       serverFiltering: true, 
       transport: { 
        read: function (options) { 
         console.log("List"); 
         console.log(options.data); 
         requestParams = { 
          "entityName": "worker", 
          "page": 1, 
          "pageSize": 20, 
          "filter": options.data.filter, 
          "sort": [ 
           { 
            "field": "name", 
            "ord": "asc" 
           } 
          ] 
         }; 
         ApiService.doHttpRequest(
          "POST", 
          $rootScope.apiBaseUrl + "worker/search", 
          requestParams 
         ) 
         .success(function (data, status, headers, config) { 
          // successful data retrieval 
          console.log("request success, checking state"); 
          console.log(data); 
          // sent status to global HTTP status service 
          var jsonResponse = ApiService.processReturnedHttpState(status); 
          console.log("Status response is " + jsonResponse.result); 
          // do something with data 
          switch (jsonResponse.result) { 
           case true: 
            options.success(data.results); 
            break; 
           case false: 
            growlNotifications.add($translate.instant('LIST_LOADING_ERROR'), 'error', $rootScope.notificationLifetime); 
            break; 
          } 
         }) 
         .error(function (data, status, headers, config) { 
          deferred.reject(e); 
          // hide loading spinner 
          kendo.ui.progress(gridView, false); 
         }); 
        } 
       } 
      }, 
      //dataTextField: "name", 
      dataValueField: "id", 
      template: '#: data.name # #: data.surname #', 
      filter: "contains", 
      minLength: 1, 
      select : function (e) { 
       console.log("select"); 
       var dataItem = this.dataItem(e.item.index()); 
       console.log(dataItem); 
       deferred.resolve(dataItem); 
      } 
     }); 
     return deferred.promise; 
    }; 

Проблема заключается в том, что function(answer) { вызывается только в первый раз выберите событие. Во второй раз и больше не вызвано событие ответа на обещание (и ввод заполняется значением [Object, Object]).

Я нашел, что лучшим решением должно быть использование обратного вызова или события вместо этого, но я не знаю, как это сделать правильно.

Может ли кто-нибудь мне сказать, как это сделать правильно?

Спасибо за любую помощь.

ответ

0

Вы можете использовать функцию обратного вызова следующим образом:

this.workersListForAutocomplete = function (container, options,callback) { 
    $("#autocompleteWorker").kendoAutoComplete({ 
     dataSource : { 
      type: "json", 
      serverFiltering: true, 
      transport: { 
       read: function (options) { 
        console.log("List"); 
        console.log(options.data); 
        requestParams = { 
         "entityName": "worker", 
         "page": 1, 
         "pageSize": 20, 
         "filter": options.data.filter, 
         "sort": [ 
          { 
           "field": "name", 
           "ord": "asc" 
          } 
         ] 
        }; 
        ApiService.doHttpRequest(
         "POST", 
         $rootScope.apiBaseUrl + "worker/search", 
         requestParams 
        ) 
        .success(function (data, status, headers, config) { 
         // successful data retrieval 
         console.log("request success, checking state"); 
         console.log(data); 
         // sent status to global HTTP status service 
         var jsonResponse = ApiService.processReturnedHttpState(status); 
         console.log("Status response is " + jsonResponse.result); 
         // do something with data 
         switch (jsonResponse.result) { 
          case true: 
           options.success(data.results); 
           break; 
          case false: 
           growlNotifications.add($translate.instant('LIST_LOADING_ERROR'), 'error', $rootScope.notificationLifetime); 
           break; 
         } 
        }) 
        .error(function (data, status, headers, config) { 
         callback(e,null); 
         // hide loading spinner 
         kendo.ui.progress(gridView, false); 
        }); 
       } 
      } 
     }, 
     //dataTextField: "name", 
     dataValueField: "id", 
     template: '#: data.name # #: data.surname #', 
     filter: "contains", 
     minLength: 1, 
     select : function (e) { 
      console.log("select"); 
      var dataItem = this.dataItem(e.item.index()); 
      console.log(dataItem); 
      callback(null,dataItem); 
     } 
    }); 
    return deferred.promise; 
}; 

и в контроллере:

$scope.initAutoCompleteForWorkers = function (id) { 
     // INIT AUTOCOMPLETE FOR WORKERS 
    GlobalHelperService.workersListForAutocomplete(function(err,answer){ 
     if(err){ 
      // report something 
      console.log("Error"); 
      console.log("Processing error with status " +status); 
      growlNotifications.add($translate.instant('PROCESSING_REQUEST_ERROR') + jsonResponse.message , 'error', $rootScope.notificationLifetime); 
     } else { 
      // do something 
      console.log("Answer"); 
      console.log(answer); 
      console.log("Name" + answer.name); 
      console.log("Surname" + answer.surname); 
      //$scope.projectDetail.newWorker = ""; 
      //$scope.projectDetail.newWorkerName = ""; 
      $scope.projectDetail.newWorker = answer; 
      $scope.projectDetail.newWorkerName = answer.name +" "+answer.surname ; 
     } 
    }); 
}; 
+0

Спасибо, но я всегда получаю неперехваченным TypeError: неопределенные не функция обратного вызова (нуль, DataItem); – redrom

Смежные вопросы