AWS API Gateway
February 16, 2020 Leave a comment
Software Developer Notes
July 19, 2015 Leave a comment
in previous post we concentrated on how to consume json data from server. i.e. user provide stock symbol in search box and and click on search button.
in this post we will add one more functionality i.e. adding stock to watch list(although stock data is not updated but we will check how to auto refresh this data in next post.)
Irrespective of programming language service provide following benefits
apart from this in angular js it provide one more benefit i.e. caching of data which can be accessed by multiple controllers, giving http call.
User provide stock symbol and click search.
user click on add to watch list system will add stock in watch list.
<script src=”https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js”></script>
<script src=”stockSearchWatchListController.js”></script>
<script src=”yahooFinanceYQLAPIService.js”></script>
<link href=’http://fonts.googleapis.com/css?family=Amaranth:400,400italic’ rel=’stylesheet’ type=’text/css’>
<style>
body {font-family: ‘Amaranth’, sans-serif;}
table, th , td {border: 1px solid grey;border-collapse: collapse;padding: 5px;}
table tr:nth-child(even) {background-color: #f1f1f1;}
table tr:nth-child(odd) {background-color: #ffffff;}
table th {background-color: #A0AFD8;color:F9F7F7;}
button {background-color: #A0AFD8; border-radius: 5px;font-style: italic; text-decoration: underline;}
input{border-radius: 5px; font-style: italic;}
</style>
//define module named stockModule
var stockModule = angular.module(‘stockModule’,[]);
var yahooFinanceYQLAPIService=function($http){
//default implementation
};
module.factory(“yahooFinanceYQLAPIService”,yahooFinanceYQLAPIService);
//define module named stockModule
var stockModule = angular.module(‘stockModule’,[]);
//replace $http with yahooFinanceYQLAPIService since yahooFinanceYQLAPIService is taking care of http communication
stockModule.controller(‘myStockSeachController’,function($scope,yahooFinanceYQLAPIService){
$scope.getScriptDetails=function(){
console.log(“script details “+$scope.scriptcode);
var response=yahooFinanceYQLAPIService.getScriptsDetails($scope.scriptcode);
response.success(function(data, status, headers, config) {
$scope.scriptDetails=data;
});
response.error(function(data, status, headers, config) {
console.log(“failure “+data+” status “+status+” headers “+headers);
});
};
});
stockModule.controller(‘addStockToWatchListController’,function($scope,yahooFinanceYQLAPIService){
$scope.addToWatchList=function(){
console.log(“adding script to watchList”);
var response=yahooFinanceYQLAPIService.addScriptToWatchList();
if (response === undefined) {
return;
}
response.success(function(data, status, headers, config) {
if(data.query.count!=1){
$scope.scripts=data.query.results.quote;
}else{
var scriptArray=[];
scriptArray.push(data.query.results.quote);
$scope.scripts=scriptArray;
}
});
response.error(function(data, status, headers, config) {
console.log(“failure “+data+” status “+status+” headers “+headers);
});
};
});
var yahooFinanceYQLAPIService=function($http){
var latestScriptCode=”;//useful for addScriptToWatchList i.e. shared between both search controller and watchlist controller.
var getScriptsDetails=function(script){
var url=’https://query.yahooapis.com/v1/public/yql’;
var query=’select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22’+’\”+script+’%22)&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback’;
url=url+’?q=’+query;
latestScriptCode=script;
return $http.get(url);
};
var watchListScripts=[];
var addScriptToWatchList=function addScriptToWatchList(){
if(watchListScripts.indexOf(latestScriptCode)>=0){
return;
}
watchListScripts.push(latestScriptCode);
console.log(“watchListScripts:- “+watchListScripts.join());
var url=’https://query.yahooapis.com/v1/public/yql’;
var query=’select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22’+’\”+watchListScripts.join()+’%22)&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback’;
url=url+’?q=’+query;
return $http.get(url);
};
return{
getScriptsDetails:getScriptsDetails,
addScriptToWatchList:addScriptToWatchList
};
};
var module=angular.module(“stockModule”);
module.factory(“yahooFinanceYQLAPIService”,yahooFinanceYQLAPIService);
<body ng-app=”stockModule”>
<div ng-controller=”myStockSeachController” align=”center”>
<div>Stock Quote</div>
<div>
<form name=”stockQuoteForm”>
<input type=”text” required placeholder=”scriptcode” class=”form-control” ng-model=”scriptcode”>
<button ng-click=”getScriptDetails()” type=”button” class=”btn btn-primary”>Search</button>
</form>
</div>
<table ng-show=”scriptDetails”>
<thead>
<tr>
<th>Name</th>
<th>symbol</th>
<th>LastTradePriceOnly</th>
<th>Ask</th>
<th>Bid</th>
<th>AverageDailyVolume</th>
<th>Currency</th>
<th>LastTradeDate</th>
<th>LastTradeTime</th>
<th>DaysLow</th>
<th>DaysHigh</th>
<th>YearLow</th>
<th>YearHigh</th>
<th>PE Ratio</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{scriptDetails.query.results.quote.Name}}</td>
<td>{{scriptDetails.query.results.quote.symbol}}</td>
<td>{{scriptDetails.query.results.quote.LastTradePriceOnly}}</td>
<td>{{scriptDetails.query.results.quote.Ask}}</td>
<td>{{scriptDetails.query.results.quote.Bid}}</td>
<td>{{scriptDetails.query.results.quote.AverageDailyVolume}}</td>
<td>{{scriptDetails.query.results.quote.Currency}}</td>
<td>{{scriptDetails.query.results.quote.LastTradeDate}}</td>
<td>{{scriptDetails.query.results.quote.LastTradeTime}}</td>
<td>{{scriptDetails.query.results.quote.DaysLow}}</td>
<td>{{scriptDetails.query.results.quote.DaysHigh}}</td>
<td>{{scriptDetails.query.results.quote.YearLow}}</td>
<td>{{scriptDetails.query.results.quote.YearHigh}}</td>
<td>{{scriptDetails.query.results.quote.PERatio}}</td>
</tr>
</tbody>
</table>
</div>
<div ng-controller=”addStockToWatchListController” align=”center”>
<p>
<button ng-click=”addToWatchList()” type=”button” class=”btn btn-primary”>AddToWatchList</button>
</p>
<div ng-show=”scripts”>
<table>
<thead>
<tr>
<th ng-click=”sortColumn(‘Name’)” >Name</th>
<th ng-click=”sortColumn(‘symbol’)”>symbol</th>
<th ng-click=”sortColumn(‘LastTradePriceOnly’)”>LastTradePriceOnly</th>
<th ng-click=”sortColumn(‘Ask’)”>Ask</th>
<th ng-click=”sortColumn(‘Bid’)”>Bid</th>
<th ng-click=”sortColumn(‘AverageDailyVolume’)”>AverageDailyVolume</th>
<th>Currency</th>
<th ng-click=”sortColumn(‘LastTradeDate’)”>LastTradeDate</th>
<th ng-click=”sortColumn(‘LastTradeTime’)”>LastTradeTime</th>
<th ng-click=”sortColumn(‘DaysLow’)”>DaysLow</th>
<th ng-click=”sortColumn(‘DaysHigh’)”>DaysHigh</th>
<th ng-click=”sortColumn(‘YearLow’)”>YearLow</th>
<th ng-click=”sortColumn(‘YearHigh’)”>YearHigh</th>
<th ng-click=”sortColumn(‘PERatio’)”>PE Ratio</th>
</tr>
</thead>
<tbody>
<tr ng-repeat=”sc in scripts”>
<td>{{sc.Name}}</td>
<td>{{sc.symbol}}</td>
<td>{{sc.LastTradePriceOnly}}</td>
<td>{{sc.Ask}}</td>
<td>{{sc.Bid}}</td>
<td>{{sc.AverageDailyVolume}}</td>
<td>{{sc.Currency}}</td>
<td>{{sc.LastTradeDate}}</td>
<td>{{sc.LastTradeTime}}</td>
<td>{{sc.DaysLow}}</td>
<td>{{sc.DaysHigh}}</td>
<td>{{sc.YearLow}}</td>
<td>{{sc.YearHigh}}</td>
<td>{{sc.PERatio}}</td>
</tr>
</tbody>
</table>
</div>
</div>
</body>
July 12, 2015 1 Comment
In earlier post we understood just about basic facts about how to configure controller in angular JS. In this post we will concentrate on how to send HTTP requests and consume the JSON response.
Example for HTTP request
We will be using Yahoo’s query API for getting stock details. i.e. https://query.yahooapis.com/v1/public/yql
We need to also attach following query parameters to the above URL.
YQL for fetching data for YAHOO (YHOO).
Replacing $scope. scriptcode=YHOO
select * from yahoo.finance.quotes where symbol in (‘+’\”+$scope.scriptcode+’)
Complete URL for getting stock details
We will offer a search facility to the end-user where users can give stock symbol.
When a user provides stock symbol and click search then the system will give call to yahoo server and fetch the response in JSON to display stock details in the following way.
<script src=”https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js”></script>
<script src=”angularjsHttpCall.js”></script>
<link href=’http://fonts.googleapis.com/css?family=Amaranth:400,400italic’ rel=’stylesheet’ type=’text/css’>
<style>
body {font-family: ‘Amaranth’, sans-serif;}
table, th , td {border: 1px solid grey;border-collapse: collapse;padding: 5px;}
table tr:nth-child(even) {background-color: #f1f1f1;}
table tr:nth-child(odd) {background-color: #ffffff;}
table th {background-color: #A0AFD8;color:F9F7F7;}
button {background-color: #A0AFD8; border-radius: 5px;font-style: italic; text-decoration: underline;}
input{border-radius: 5px; font-style: italic;}
</style>
We are adding google fonts. In order to add different fonts, please visit https://www.google.com/fonts
<body ng-app=”angularJSHTTPCallModule” ng-controller=”angularJSHTTPCallController”>
<div>Stock Quote</div>
<div>
<form name=”stockQuoteForm”>
<input type=”text” required placeholder=”scriptcode” class=”form-control” ng-model=”scriptcode”>
<button ng-click=”getScriptDetails()” type=”button” class=”btn btn-primary”>Search</button>
</form>
</div>
By looking at above code two important attributes (directives) highlighted. More information about all available directives here
<table ng-show=”scriptDetails”>
<thead>
<tr>
<th>Name</th>
<th>symbol</th>
<th>LastTradePriceOnly</th>
<th>Ask</th>
<th>Bid</th>
<th>AverageDailyVolume</th>
<th>Currency</th>
<th>LastTradeDate</th>
<th>LastTradeTime</th>
<th>DaysLow</th>
<th>DaysHigh</th>
<th>YearLow</th>
<th>YearHigh</th>
<th>PE Ratio</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{scriptDetails.query.results.quote.Name}}</td>
<td>{{scriptDetails.query.results.quote.symbol}}</td>
<td>{{scriptDetails.query.results.quote.LastTradePriceOnly}}</td>
<td>{{scriptDetails.query.results.quote.Ask}}</td>
<td>{{scriptDetails.query.results.quote.Bid}}</td>
<td>{{scriptDetails.query.results.quote.AverageDailyVolume}}</td>
<td>{{scriptDetails.query.results.quote.Currency}}</td>
<td>{{scriptDetails.query.results.quote.LastTradeDate}}</td>
<td>{{scriptDetails.query.results.quote.LastTradeTime}}</td>
<td>{{scriptDetails.query.results.quote.DaysLow}}</td>
<td>{{scriptDetails.query.results.quote.DaysHigh}}</td>
<td>{{scriptDetails.query.results.quote.YearLow}}</td>
<td>{{scriptDetails.query.results.quote.YearHigh}}</td>
<td>{{scriptDetails.query.results.quote.PERatio}}</td>
</tr>
</tbody>
</table>
(function() {
var angularJSHTTPCallModule = angular.module(‘angularJSHTTPCallModule’,[]);
angularJSHTTPCallModule.controller(‘angularJSHTTPCallController’,function($scope,$http){
$scope.getScriptDetails=function(){
var url=’https://query.yahooapis.com/v1/public/yql’;
var query=’select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22’+’\”+$scope.scriptcode+’%22)&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback’;
url=url+’?q=’+query;
var response=$http.get(url);
response.success(function(data, status, headers, config) {
$scope.scriptDetails=data;
var js1=JSON.stringify(data);
console.log(“js12 “+js1);
});
response.error(function(data, status, headers, config) {
console.log(“failure “+data+” status “+status+” headers “+headers);
});
};
});
}());
in above code asynchronous successful response available from server is given to success method while error handled with error method.
July 12, 2015 Leave a comment
In earlier post we concentrated on the benefits of designing JS in a specific way. In this post we will look at
To work with the core angular js functionality one needs to include only angular js in view(jsp, html….)
<script src=”https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js”></script>
In above case empty array indicates no dependency but has implicit dependency with core module.
//Define MyController and attaching it to the module
myfirstAgnularModule.controller(‘MyController’,function($scope){
$scope.message=”Hello Angular”;
});
In above case $scope is an angular specific object. Any parameter which starts with $ managed by angular js.
In above case we are attaching message to $scope object. Anything which we are attaching to $scope object will be acting as models.
By looking at this example we can say controller is not directly communicate with a view (html) but it is through the model.
On macroscopic level controller is responsible for
<!– load angular js from CDN –>
<script src=”https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js”></script>
<body ng-app=”myfirstAgnularModule” ng-controller=”MyController”>
{{message}}
</body>
These attributes are known as directives
(function() {
var myfirstAgnularModule = angular.module(‘myfirstAgnularModule’,[]);
myfirstAgnularModule.controller(‘MyController’,function($scope){
$scope.message=”Hello Angular”;
});
}());
<html>
<head>
<script src=”https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js”></script>
<script src=”myFirstAngularExample.js”></script>
</head>
<body ng-app=”myfirstAgnularModule” ng-controller=”MyController”>
{{message}}
</body>
</html>
July 11, 2015 3 Comments
Target Audience: – Beginner
Angular JS is a Java script open source framework from Google and downloadable from https://angularjs.org/
Angular is based on following important concepts
Function expression
Assign function to variable.
By doing this, one can dynamically change call to the function.
Used inside function to make encapsulation and code more and more modular
var myWork=function(){
console.log(“myWork Invoked”);
};
Function expressions are of two types
An anonymous function expression
var myWork=function(){
console.log(“myWork Invoked”);
};
Named function expression
var myWork=function myWorkFunction(){
console.log(“myWork Invoked”);
};
function expression offer better facility for encapsulation
Consider the following simple example
//Step 1: – concentrate on implementation logic: -Function expression with global variable myProcess
var myProcess=function myProcessF(){
var preProcess=function(){
console.log(“in preProcess”);
};
var postProcess=function(){
console.log(“in postProcess”);
};
var doProcess=function(){
console.log(“in process”);
};
// Some private function which used internally
var somePrivateFunction=function(){
console.log(“some internal function”);
}
//Expose functions and variable which used outside this function: Good example of encapsulation
return{
//Aliasing
preProcessing:preProcess,
postProcessing:postProcess,
doProcessing:doProcess
};
};
//Invoke Function
var process =myProcess();
process.preProcessing();
process.doProcessing();
process.postProcessing();
When this code executed it give the following output.
Avoid creating Global variables
By looking at above example, we can see that myProcess is a global variable. These types of variables are candidate for overriding hence one needs to avoid creating global variables with the help of IIFY
(function() {
// The code here executed once in its own scope
}());