Wednesday 15 February 2012

javascript - How to refactor Angular promise to Callback? -



javascript - How to refactor Angular promise to Callback? -

i have controller init method initialize autocomplete input in template:

$scope.initautocompleteforworkers = function (id) { // init autocomplete workers var promise = globalhelperservice.workerslistforautocomplete(); promise.then( function(answer) { // 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) { // study console.log("error"); console.log("processing error status " +status); growlnotifications.add($translate.instant('processing_request_error') + jsonresponse.message , 'error', $rootscope.notificationlifetime); }, function(progress) { // study progress console.log("progres"); }); };

this init method should returned deffered.resolve after each select event.

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 info retrieval console.log("request success, checking state"); console.log(data); // sent status global http status service var jsonresponse = apiservice.processreturnedhttpstate(status); console.log("status response " + jsonresponse.result); // info 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); } }); homecoming deferred.promise; };

problem function(answer) { called first time select event. on sec time , more not reply promise event called (and input filled [object, object] value).

i found improve solution should utilize callback or event instead, don't know how in right way.

could tells me, how right?

thanks help.

you can utilize callback in next way:

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 info retrieval console.log("request success, checking state"); console.log(data); // sent status global http status service var jsonresponse = apiservice.processreturnedhttpstate(status); console.log("status response " + jsonresponse.result); // info 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); } }); homecoming deferred.promise; };

and in controller:

$scope.initautocompleteforworkers = function (id) { // init autocomplete workers globalhelperservice.workerslistforautocomplete(function(err,answer){ if(err){ // study console.log("error"); console.log("processing error status " +status); growlnotifications.add($translate.instant('processing_request_error') + jsonresponse.message , 'error', $rootscope.notificationlifetime); } else { // 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 ; } }); };

javascript angularjs events callback

No comments:

Post a Comment