<div ng-app='theApp' ng-controller='SampleController as c'>
<label>Search</label><p><input type='text' ng-model='c.topic'/>
<button ng-click='c.getTopMatch()'>Get Top Match</button>
<p>
<span ng-show='c.topMatch.length !=""'>Top Match: {{c.topMatch}}<span>
</p>
</div>
var app = angular.module('theApp', ['oitozero.ngSweetAlert']);
app.controller('SampleController',['$http', 'SweetAlert', function($http, SweetAlert) {
var self = this;
self.topic = 'angularjs';
self.topMatch = '';
self.getTopMatch = function() {
$http.jsonp('http://ajax.googleapis.com/ajax/services/search/web?v=1.0&callback=JSON_CALLBACK',
{
params : { 'q' : self.topic }
})
.success(function(data) {
self.topMatch = data.responseData.results[0].url;
SweetAlert.swal({
title: "Clear Search?",
text: "Everyone wants a clear textbox",
type: "success",
showCancelButton: true,
cancelButtonText: 'No',
confirmButtonText: "Yes!"
},
function(isConfirm){
if (!isConfirm) return;
self.topic = '';
});
});
};
}]);
We can solve that by wrapping our changes on model inside of AngularJS $q service:
var app = angular.module('theApp', ['oitozero.ngSweetAlert']);
app.controller('SampleController',['$http', '$q', 'SweetAlert', function($http, $q, SweetAlert) {
var self = this;
self.topic = 'angularjs';
self.topMatch = '';
self.getTopMatch = function() {
$http.jsonp('http://ajax.googleapis.com/ajax/services/search/web?v=1.0&callback=JSON_CALLBACK',
{
params : { 'q' : self.topic }
})
.success(function(data) {
self.topMatch = data.responseData.results[0].url;
SweetAlert.swal({
title: "Clear Search?",
text: "Everyone wants a clear textbox",
type: "success",
showCancelButton: true,
cancelButtonText: 'No',
confirmButtonText: "Yes!"
},
function(isConfirm){
if (!isConfirm) return;
var deferred = $q.defer();
deferred.promise.then(function() {
self.topic = '';
});
deferred.resolve();
});
});
};
}]);
Note that we need to inject $q service to our controller. If that's a bit overkill, we can skip the use of $q service and use another approach. Another approach is to dynamically add a promise on existing $http's promise when a callback outside of AngularJS is made, an example:
var app = angular.module('theApp', ['oitozero.ngSweetAlert']);
app.controller('SampleController',['$http', 'SweetAlert', function($http, SweetAlert) {
var self = this;
self.topic = 'angularjs';
self.topMatch = '';
self.getTopMatch = function() {
var thePromise =
$http.jsonp('http://ajax.googleapis.com/ajax/services/search/web?v=1.0&callback=JSON_CALLBACK',
{
params : { 'q' : self.topic }
})
.success(function(data) {
self.topMatch = data.responseData.results[0].url;
SweetAlert.swal({
title: "Clear Search?",
text: "Everyone wants a clear textbox",
type: "success",
showCancelButton: true,
cancelButtonText: 'No',
confirmButtonText: "Yes!"
},
function(){
thePromise.then(function() {
self.topic = '';
});
});
});
};
}]);
UPDATE
Another good approach is to use $timeout, unlike $scope.$apply/$scope.$digest, $timeout is testable. Though it works, it is not advisable to use $scope.$apply/$scope.$digest in a controller. $timeout works and it is testable:
var app = angular.module('theApp', ['oitozero.ngSweetAlert']);
app.controller('SampleController',['$http', '$timeout', 'SweetAlert', function($http, $timeout, SweetAlert) {
var self = this;
self.topic = 'angularjs';
self.topMatch = '';
self.getTopMatch = function() {
$http.jsonp('http://ajax.googleapis.com/ajax/services/search/web?v=1.0&callback=JSON_CALLBACK',
{
params : { 'q' : self.topic }
})
.success(function(data) {
self.topMatch = data.responseData.results[0].url;
SweetAlert.swal({
title: "Clear Search?",
text: "Everyone wants a clear textbox",
type: "success",
showCancelButton: true,
cancelButtonText: 'No',
confirmButtonText: "Yes!"
},
function(isConfirm){
if (!isConfirm) return;
$timeout(function() {
self.topic = '';
});
});
});
};
}]);
Happy Coding!
No comments:
Post a Comment