Sunday, December 25, 2016

Usage of Enums in typescript

Usage of Enums in typescript

Declaration of enum in TypeScript as given below:

export enum  Category {Cricket,Tennis,GOLF,Badminton}

and in required .ts file import like a module as given below:

import {Category} from './enums'

Note : enums is another ts file, Kindly refer an image below for enums.ts file

image

Wednesday, October 26, 2016

Developing Book My Seat Application In AngularJS And ASP.NET - WebAPI Methods - Part Two

Here, I’ve merely thought to write my thoughts about hands-on Angular. This is my first article which tells you how to get your hands dirty with AngularJS & ASP.NET WEBAPI and SQL Server BookMySeat Application Tutorials.

This is the technology stack for this BookMySeat library application, as shown below:

In the first article, I shared the technology and other brief information about components used. In this article, will look into WebApi creation and route to configure that.
This is an initial look at the WebAPI controller defined in Solution Explorer as depicted below:

If you open this file, you will have around 6 methods which have generic names to perform the operations and easy to understand.These WebAPI methods are given below:




The complete code for all APIs is given below.

  1. public class BookMySeatAPIController : ApiController 
  2.     { 
  3. //
  4. // GET: /BookMySeatAPI/
  5.         SqlConnection objConnection = new SqlConnection(); 
  6. public void SqlConnection() 
  7.         { 
  8.             objConnection.Dispose(); 
  9.             objConnection.ConnectionString = "server=.;database=BookMySeat;uid=sa;pwd=Tpg@1234;"; 
  10.             objConnection.Open(); 
  11.         } 
  12.         [HttpGet] 
  13. public int[] GetSeatCount([FromUri] int slot) 
  14.         { 
  15. try
  16.             { 
  17.                 SqlConnection(); 
  18.                 SqlCommand SqlCommand = new SqlCommand("sp_GetMySeat", objConnection); 
  19.                 SqlCommand.CommandType = CommandType.StoredProcedure; 
  20.                 SqlCommand.Parameters.AddWithValue("@timeslotid", slot); 
  21.                 SqlDataAdapter da = new SqlDataAdapter(SqlCommand); 
  22.                 da.SelectCommand = SqlCommand; 
  23.                 DataSet ds = new DataSet(); 
  24.                 da.Fill(ds); 
  25. int[] result = new int[ds.Tables[0].Rows.Count]; 
  26. for (int i = 0; i < ds.Tables[0].Rows.Count; i++) 
  27.                 { 
  28.                     result[i] = Convert.ToInt16(ds.Tables[0].Rows[i][0].ToString()); 
  29.                 } 
  30. return result; 
  31.             } 
  32. finally
  33.             { 
  34.                 objConnection.Close(); 
  35.                 objConnection.Dispose(); 
  36.             } 
  37.         } 
  38.         [HttpPost] 
  39.         [ActionName("SeatBook")] 
  40. public int[] PostBookSeat(BookSeat objBookSeat) 
  41.         { 
  42. try
  43.             { 
  44.                 SqlConnection(); 
  45.                 SqlCommand SqlCommand = new SqlCommand("sp_BookMySeat", objConnection); 
  46.                 SqlCommand.CommandType = CommandType.StoredProcedure; 
  47.                 SqlCommand.Parameters.AddWithValue("@UserName", objBookSeat.UserName); 
  48.                 SqlCommand.Parameters.AddWithValue("@TimeSlot", objBookSeat.TimeSlot); 
  49.                 SqlCommand.Parameters.AddWithValue("@SeatNo", objBookSeat.SeatNo); 
  50.                 SqlDataAdapter da = new SqlDataAdapter(SqlCommand); 
  51.                 da.SelectCommand = SqlCommand; 
  52.                 DataSet ds = new DataSet(); 
  53.                 da.Fill(ds); 
  54. int[] result = new int[ds.Tables[0].Rows.Count]; 
  55. for (int i = 0; i < ds.Tables[0].Rows.Count; i++) 
  56.                 { 
  57.                     result[i] = Convert.ToInt16(ds.Tables[0].Rows[i][0].ToString()); 
  58.                 } 
  59. return result; 
  60.             } 
  61. finally
  62.             { 
  63.                 objConnection.Close(); 
  64.                 objConnection.Dispose(); 
  65.             } 
  66.         } 
  67.         [HttpPost] 
  68.         [ActionName("ValidateUser")] 
  69. public string ValidateUser(ValidateUser objValidateUser) 
  70.         { 
  71. try
  72.             { 
  73.                 SqlConnection(); 
  74.                 SqlCommand SqlCommand = new SqlCommand("ValidateUser", objConnection); 
  75.                 SqlCommand.CommandType = CommandType.StoredProcedure; 
  76.                 SqlCommand.Parameters.AddWithValue("@UserName", objValidateUser.UserName); 
  77.                 SqlDataAdapter da = new SqlDataAdapter(SqlCommand); 
  78.                 da.SelectCommand = SqlCommand; 
  79.                 DataSet ds = new DataSet(); 
  80.                 da.Fill(ds); 
  81. return ds.Tables[0].Rows[0][0].ToString(); 
  82.             } 
  83. finally
  84.             { 
  85.                 objConnection.Close(); 
  86.                 objConnection.Dispose(); 
  87.             } 
  88.         } 
  89.         [HttpPost] 
  90.         [ActionName("SeatDetail")] 
  91. public string GetSeatDetail(GetSeatDetail objGetSeatDetail) 
  92.         { 
  93. try
  94.             { 
  95.                 SqlConnection(); 
  96.                 SqlCommand SqlCommand = new SqlCommand("sp_GetSeatDetail", objConnection); 
  97.                 SqlCommand.CommandType = CommandType.StoredProcedure; 
  98. // SqlCommand.Parameters.AddWithValue("@UserName", objBookSeat.UserName);
  99.                 SqlCommand.Parameters.AddWithValue("@TimeSlot", objGetSeatDetail.TimeSlot); 
  100.                 SqlCommand.Parameters.AddWithValue("@SeatNo", objGetSeatDetail.SeatNo); 
  101.                 SqlDataAdapter da = new SqlDataAdapter(SqlCommand); 
  102.                 da.SelectCommand = SqlCommand; 
  103.                 DataSet ds = new DataSet(); 
  104.                 da.Fill(ds); 
  105. return ds.Tables[0].Rows[0][0].ToString(); 
  106.             } 
  107. finally
  108.             { 
  109.                 objConnection.Close(); 
  110.                 objConnection.Dispose(); 
  111.             } 
  112.         } 
  113.         [HttpPost] 
  114.         [ActionName("DeleteSeat")] 
  115. public string DeleteSeat(DeleteSeat objDeleteSeat) 
  116.         { 
  117. try
  118.             { 
  119.                 SqlConnection(); 
  120.                 SqlCommand SqlCommand = new SqlCommand("sp_DeleteSeat", objConnection); 
  121.                 SqlCommand.CommandType = CommandType.StoredProcedure; 
  122. // SqlCommand.Parameters.AddWithValue("@UserName", objBookSeat.UserName);              
  123.                 SqlCommand.Parameters.AddWithValue("@SeatNo", objDeleteSeat.SeatNo); 
  124.                 SqlCommand.Parameters.AddWithValue("@SlotNo", objDeleteSeat.TimeSlot); 
  125.                 SqlDataAdapter da = new SqlDataAdapter(SqlCommand); 
  126.                 da.SelectCommand = SqlCommand; 
  127.                 DataSet ds = new DataSet(); 
  128.                 da.Fill(ds); 
  129. return ds.Tables[0].Rows[0][0].ToString(); 
  130.             } 
  131. finally
  132.             { 
  133.                 objConnection.Close(); 
  134.                 objConnection.Dispose(); 
  135.             } 
  136.         } 
  137.         [HttpGet] 
  138. public List<ShowBookSeat> ShowBookSeat() 
  139.         { 
  140. try
  141.             { 
  142.                 SqlConnection(); 
  143.                   List<ShowBookSeat> list = new List<ShowBookSeat>();  
  144.                 SqlCommand SqlCommand = new SqlCommand("sp_ShowBookDetail", objConnection); 
  145.                 SqlCommand.CommandType = CommandType.StoredProcedure; 
  146. // SqlCommand.Parameters.AddWithValue("@UserName", objBookSeat.UserName);              
  147. //SqlCommand.Parameters.AddWithValue("@UserName", objDeleteSeat.SeatNo);
  148. //SqlCommand.Parameters.AddWithValue("@SlotNo", objDeleteSeat.TimeSlot);
  149.                 SqlDataAdapter da = new SqlDataAdapter(SqlCommand); 
  150.                 da.SelectCommand = SqlCommand; 
  151.                 DataSet ds = new DataSet(); 
  152.                 da.Fill(ds); 
  153. for (int i = 0; i < ds.Tables[0].Rows.Count; i++) 
  154.                 { 
  155.                     ShowBookSeat ShowBookSeat = new ShowBookSeat(); 
  156.                     ShowBookSeat.UserName = (ds.Tables[0].Rows[i]["username"]).ToString(); 
  157.                     ShowBookSeat.Date =Convert.ToDateTime(ds.Tables[0].Rows[i]["currentday"]); 
  158.                     ShowBookSeat.TimeSlot = Convert.ToInt32(ds.Tables[0].Rows[i]["timeslot"]); 
  159.                     ShowBookSeat.SeatNo = Convert.ToInt32(ds.Tables[0].Rows[i]["seatno"]); 
  160.                     list.Add(ShowBookSeat); 
  161.                 } 
  162. return list;  
  163.             } 
  164. finally
  165.             { 
  166.                 objConnection.Close(); 
  167.                 objConnection.Dispose(); 
  168.             } 
  169.         } 
  170.     } 

Code segment for WebApiConfig under App_start folder is given below.

  1. public static class WebApiConfig 
  2.     { 
  3. public static void Register(HttpConfiguration config) 
  4.         { 
  5.             config.Routes.MapHttpRoute( 
  6.                 name: "DefaultApi", 
  7.                 routeTemplate: "api/{controller}/{id}", 
  8.                 defaults: new { id = RouteParameter.Optional } 
  9.             ); 
  10.             config.Routes.MapHttpRoute( 
  11.                name: "seatbook", 
  12.                routeTemplate: "api/seat/{controller}/{action}/{id}", 
  13.                defaults: new { id = RouteParameter.Optional } 
  14.            ); 
  15.             config.Routes.MapHttpRoute( 
  16.                name: "seatDetail", 
  17.                routeTemplate: "api/seatdetail/{controller}/{action}/{id}", 
  18.                defaults: new { id = RouteParameter.Optional } 
  19.            ); 
  20.             config.Routes.MapHttpRoute( 
  21.                name: "ValidateUser", 
  22.                routeTemplate: "api/ValidateUser/{controller}/{action}/{id}", 
  23.                defaults: new { id = RouteParameter.Optional } 
  24.            ); 
  25.             config.Routes.MapHttpRoute( 
  26.                name: "DeleteSeat", 
  27.                routeTemplate: "api/DeleteSeat/{controller}/{action}/{id}", 
  28.                defaults: new { id = RouteParameter.Optional } 
  29.            ); 
  30.         } 
  31.     } 

The application which we are about to build consists almost all of the above defined keywords and the initial look of the application is as shown below.

Hope it’ll help you some day. Enjoy Coding.

Wednesday, October 19, 2016

BOOKMYSEAT APPLICATION AngularJS  Asp.Net Webapi and Sql Server 2012

Here, I’ve thought to write my thoughts about hands-on Angular. This is the first article, which tells you  how to get your hands dirty with AngularJS, ASP.NET WEBAPI and SQL Server BookMySeat Application Tutorials.
This is the technology stack for BookMySeat library Application, as shown below:



I’ve designed a simple BookMySeat Library Application, where you will be familiarized with a few keywords & components, which you may be confronting in coming days. These keywords are shown below in the article-

Component of Angular Description

Module
Modules serve as containers to assist you to organize the code within your AngularJS Application. Modules can contain sub-modules.

$http
$http is an AngularJS Service for reading the data from the remote Servers.

Angular ui.bootstrap
<scriptdata-require="ui-bootstrap@*"data-semver="0.10.0"src="http://angular-ui.github.io/bootstrap/ui-bootstrap-tpls-0.10.0.js"></script>

Services
Services are a point, where you can put common functionality to an AngularJS Application. For example,  if you would like to share the data with more than one controller then the best way is to promote the data to the Service and then make it available via the Service. Services extend the controllers and make them more globally accessible.

Routes Routing in Angular JS
Routes allow us to determine the ways to navigate to the specific states within our Application. It also allows us to define the configuration options for each specific route, such as which template and controller to use.

View
The view in AngularJS is what exists after AngularJS has compiled and rendered the DOM.

@scope
$scope is essentially the “glue” between the view and controller within an AngularJS Application. It supports two way binding within an Application.

Controller
The controller is to define the methods and properties that the view can bind to and interact with. Controllers should be lightweight and only focus on the view; they’re controlling.

Directive
A directive is an extension of a view in AngularJS, which allows us to create custom, reusable elements. You can also consider the directives as the decorators for your HTML. Directives are used to extend the views and to make these extensions available for use in more than one place.

Route Config
The config block of an AngularJS Application allows for the configuration to be applied before the Application actually runs. This is useful to set up routes, dynamically configuring Services and so on.

Dependency Injection
How can we inject dependency in Angular controller and module? For this sample Application, we have injected $Log,$RouteParams,$modal ,Custom Services and many more.

The Application which we are about to build consists of almost all the defined keywords, mentioned above and the initial look of the application is shown below-

There are a few points which we’ll cover in this Application. To make it complete, you can also reference how this Application will work from this BookMySeat Gif representation,

  • The screenshot, shown above, is a sample form for BookMySeat Application .You can book your seat for the specific slot. You can cancel your seat also from the given slot.
  • In the same way, we’ll try to integrate UI-bootstrap (modal Popup) to show which seat is booked by the user.
  • We will focus on Custom Directive and Custom Service.
  • Usage of $http to call to WebApi to populate the data on HTML page.
  • Usage of dependency injection at the various levels, Load partial templates to MVC view page.
  • There can be some various add ons, which you can do at your level after the completion of this Application like Email notification after booking the seat, cancel the seat, booking slot information and responsive Application .
  • The structure of the BookMySeat Application is given below-

    The basic life cycle of Angular app is given below-
Hope it’ll help you some day. Enjoy coding.

Wednesday, September 21, 2016

 Bookmyseat application angularjs ,webapi and sqlserver 2008 using angular ui bootstrap

Hi Folks,

I have created a bookmyseat application which has the following technology stack.

  • AmgularJS (  Angular Module,Controller,Angular Service, Routing, Dependancy injection, Service calling using $http.post)
  • Asp.Net WebAPI (Get,Post,Put methods with Routing)
  • SQl Server 2008R2
  • Angular UI-bootstrap UI Bootstrap for PopUp purpose

 

BookMySeat

 

I’ll come with step by step articles day by day.

Thanks

Tuesday, September 13, 2016

Error: [ng:areq] Argument 'fn' is not a function, got string

[Error-Messages%255B2%255D.png]

I confronted an error which is shown above during Angular application development which was little tricky to resolve.Though later we could be able to identify an issue  and fix an issue.

At time of module loading in angular we were injecting dependancy like this:

var routingApp = angular.module('routingApp', ['ngRoute'], ['ui.bootstrap']);

Actually this is a wrong way to do ,due to this it was prompting an error

Resolution : The workaround is given below as inject a dependancy in same braket rather in different one.

var routingApp = angular.module('routingApp', ['ngRoute', 'ui.bootstrap']);

Hope it will give you some brief to fix your solution

Thanks

Thursday, September 1, 2016

angular.js:38 Uncaught Error: [$injector:modulerr] http://errors.angularjs.org/1.5.6/$injector/modulerr?p0=routingApp&p1=Error…20c%20(http%3A%2F%2Flocalhost%3A51309%2FScripts%2Fangular.min.js%3A21%3A19)

Resolution: Just keep the order of your file as shown below:

first load angula.js and than angular-route.js as given below:

<script src="~/Scripts/angular.min.js"></script>
@*   <script src="~/Scripts/angular-route.js"></script>*@

Hope it will solve your issue

Thanks

Thursday, August 25, 2016

AngularJS And ASP.NET MVC Movie Library Application - $Watch And $Digest Underhood - Part Six

Hope you have had a chance to look at the last tutorial, which talks about the technology stack and creating UI HTML pages with the module and controller and Event Binding with UI elements, as well as routing in Angular JS with partial templates.
Kindly find links here as shown below:

Moving ahead in this article, we’ll try to understand about Watch and Digest, which play a vital role from an AngularJS perspective. In the last article, we have seen the integration of IMDB API, which was in Angular context.
First, we’ll try to use watch on a textbox, as shown in the image, given below:
As the name implies the $scope.watch() function, keeps watch on some variable and looks at their behavior. Whenever you register a watch, you need two functions as the parameters to the $watch() function:
Here is an example,

  1. $scope.$watch(function() {}, 
  2. function() {} 
  3. ); 

Value functions -> which watches the current value of the parameter and returns.
A listener function-> the listener function acts on the value that has changed and takes an adequate action to change the content of another variable or may prompt something, as per the business need.
The first function is the value function and the second function is the listener function.
The value function should return the value which is being watched. AngularJS can then check the value returned against the value, the watch function returned the last time. In this way, AngularJS can determine, if the value has changed. Here is an example:

  1. $scope.$watch('searchByTitle', function (newValue, oldValue) { } 
  2. $scope.$watch('searchByTitle', function (newValue, oldValue) { } 

This example value function watches the textbox ‘searchByTitle”. If the value of this variable changes, a different value will be returned and AngularJS will call the listener function. Later on the basis of the value, being the watch listener function, performs the written logic.
Let see this implementation practically.
I’ve written the code segment in such a way, so that we can understand an actual fact easily. Kindly find a code segment, as shown below:

  1. routingApp.controller("ApiMovieController", ['$scope', '$http', '$timeout', function ($scope, $http, $timeout) { 
  2.     $scope.SearchMovieByTitle = function () { 
  3.         alert("SearchMovieByTitle called with angular scope"); 
  4. var title = $scope.searchByTitle; 
  5.         alert(title); 
  6.         $http.jsonp("http://api.myapifilms.com/imdb/idIMDB?title=" + title + "&token=5bf94c9e-203f-4a6f-91d0-a63a59a77084&format=json&language=en-us&aka=0&business=0&seasons=0&seasonYear=0&technical=0&filter=2&exactFilter=0&limit=5&forceYear=0&trailers=0&movieTrivia=0&awards=0&moviePhotos=0&movieVideos=0&actors=0&biography=0&uniqueName=0&filmography=0&bornAndDead=0&starSign=0&actorActress=0&actorTrivia=0&similarMovies=0&adultSearch=0&goofs=0"es=0&fullSize=0&companyCredits=0&callback=JSON_CALLBACK").success(function (response) { 
  7.             console.log(response); 
  8.             $scope.movies = response.data.movies; 
  9.         }) 
  10.     } 
  11.     $scope.dateTime = new Date().getMinutes(); 
  12. // alert('in controller');
  13.     document.getElementById('btnSearch').addEventListener('click', callEventListenerfn); 
  14. function callEventListenerfn(e) { 
  15.         alert("SearchMovieByTitleDigest called without angular scope"); 
  16. var title = $scope.searchByTitle; 
  17.         alert(title); 
  18.         $scope.$watch('searchByTitle', function (newValue, oldValue) { 
  19.             $scope.searchByTitle = newValue; 
  20.             console.log("$scope.searchByTitle value changed " + $scope.searchByTitle); 
  21. // alert($scope.searchByTitle);
  22.         }); 
  23.         $http.jsonp("http://api.myapifilms.com/imdb/idIMDB?title=" + $scope.searchByTitle + "&token=2cr22c9e-203f-4a6f-91d0-a63a59a77084&format=json&language=en-us&aka=0&business=0&seasons=0&seasonYear=0&technical=0&filter=2&exactFilter=0&limit=5&forceYear=0&trailers=0&movieTrivia=0&awards=0&moviePhotos=0&movieVideos=0&actors=0&biography=0&uniqueName=0&filmography=0&bornAndDead=0&starSign=0&actorActress=0&actorTrivia=0&similarMovies=0&adultSearch=0&goofs=0"es=0&fullSize=0&companyCredits=0&callback=JSON_CALLBACK") 
  24.           .success(function (response) { 
  25.               alert($scope.searchByTitle); 
  26.               $scope.movies = response.data.movies; 
  27.               $timeout(function () { 
  28.                   $scope.$digest(); 
  29.               }, 100); 
  30.           }) 
  31. // });
  32.     } 
  33. //document.getElementById("btnSearch").addEventListener('click', function () {
  34. //                console.log("Seach Started");
  35. //                alert("Seach Started");
  36. //                $scope.dateTime = new Date().getMinutes();
  37. //                $scope.$digest();
  38. //            });
  39. }]); 

The code above states that the watch function is written in JavaScript eventlistener and it activates as soon as you click the “Search Movie, using EventListner”.
“searchByTitle” is ng-model defined on SeachMovie.html page, which I’ve already shared in the last tutorials. Watch function will evaluate the change made into the input type. "searchByTitle" is shown above in the diagram. This Watch() function will be effective, as soon as you click on Search Movie, using EventListener.
code
Kindly refer to the image, shown below. As soon as I search for any movie, using button Eventlistner and change any value in textBox, it starts reflecting the changes in Console Window.
console
$Scope.Digest()- > As the name implies, Digest means to convert something into absorbable substances. Thus, it works in the same way in AngularJS also. If any event doesn’t appear in Digest cycle, it has to bring into Angular Digest cycle.

  1. $timeout(function () { 
  2. $scope.$digest(); 
  3. }, 100); 

$Scope.Digest()- />
JavaScript eventlistner calls, but sometimes it doesn't update the data bindings. In our case, we are hitting IMDB API, but sometimes, it doesn’t update the $scope.movies collection because the $scope.$digest() is not called after the second button's event listener is executed. To fix it, we can add a $scope.$digest() call to the last line of the button event listener or you can also put the code in $apply function also. Primarily, an objective to put the digest code into $timeout is only because of it to send this code asynchronously.

  1. $timeout(function () { 
  2. $scope.$digest(); 
  3. }, 100); 

Here, is the complete code for searchMovie.html and ApiMovieController, as shown below:
CodeSegment - > searchMovie.html

  1. <!DOCTYPE html> 
  2. <html xmlns="http://www.w3.org/1999/xhtml"> 
  3. <head> 
  4.     <h2>Seach Movie Using IMDB API</h2> 
  5.     <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css"> 
  6.     <style> 
  7.         .selected 
  8.         { 
  9.             background-color: lightyellow; 
  10.             color: red; 
  11.             font-weight: bold; 
  12.         } 
  13.     </style> 
  14. </head> 
  15. <body ng-app="routingApp" class="jumbotron" ng-controller="ApiMovieController"> 
  16.     <div class="container"> 
  17.         <!--<div ng-show="success" class="alert-success">Record has been upddated for movie :  {{updatedMovie.title}}</div> 
  18.          <div ng-show="clear" class="alert-success">Record has been deleted for movie :  {{updatedMovie.title}}</div>--> 
  19.         <div class="row col-md-8"> 
  20.             <table class="table table-striped "> 
  21.                 <tr> 
  22.                     <td> 
  23.                         <input type="text" ng-model="searchByTitle" class="form-control" style="width: 300px;" /> 
  24.                     </td> 
  25.                     {{dateTime}} 
  26.                     <td> 
  27.                         <button type="button" ng-click="SearchMovieByTitle()" class="btn btn-info"> 
  28.                             Search using Angular Scope 
  29.                             <span class="glyphicon glyphicon-search"></span> 
  30.                         </button> 
  31.                         <br /> 
  32.                     </td> 
  33.                 </tr> 
  34.                 <tr> 
  35.                     <td></td> 
  36.                     <td> 
  37.                         <button type="button" id="btnSearch" class="btn btn-info"> 
  38.                             Seacrh Movie Using EventListener 
  39.                             <span class="glyphicon glyphicon-search"></span> 
  40.                         </button> 
  41.                     </td> 
  42.                 </tr> 
  43.                 <tr class="thead-inverse"> 
  44.                     <td style="background-color: Highlight">Title</td> 
  45.                     <td style="background-color: Highlight">Year of Release</td> 
  46.                     <td style="background-color: Highlight">Rating</td> 
  47.                     <td style="background-color: Highlight">Plot</td> 
  48.                     <td style="background-color: Highlight">Actions</td> 
  49.                 </tr> 
  50.                 <tbody> 
  51.                     <tr ng-repeat="movie in movies" ng-class="{'selected':$index == selectedRow}"> 
  52.                         <td>{{movie.title}} 
  53.                         </td> 
  54.                         <td>{{movie.year}} 
  55.                         </td> 
  56.                         <td>{{movie.rating}} 
  57.                         </td> 
  58.                         <td>{{movie.plot }} 
  59.                         </td> 
  60.                         <td></td> 
  61.                     </tr> 
  62.                 </tbody> 
  63.             </table> 
  64.         </div> 
  65.     </div> 
  66. </body> 
  67. </html> 

Code segment for ApiMovieController is given blow:

  1. routingApp.controller("ApiMovieController", ['$scope', '$http', '$timeout', function ($scope, $http, $timeout) { 
  2.     $scope.SearchMovieByTitle = function () { 
  3.         alert("SearchMovieByTitle called with angular scope"); 
  4. var title = $scope.searchByTitle; 
  5.         alert(title); 
  6.         $http.jsonp("http://api.myapifilms.com/imdb/idIMDB?title=" + title + "&token=2gr44c9e-203f-4a6f-91d0-o6121 &format=json&language=en-us&aka=0&business=0&seasons=0&seasonYear=0&technical=0&filter=2&exactFilter=0&limit=5&forceYear=0&trailers=0&movieTrivia=0&awards=0&moviePhotos=0&movieVideos=0&actors=0&biography=0&uniqueName=0&filmography=0&bornAndDead=0&starSign=0&actorActress=0&actorTrivia=0&similarMovies=0&adultSearch=0&goofs=0"es=0&fullSize=0&companyCredits=0&callback=JSON_CALLBACK").success(function (response) { 
  7.             console.log(response); 
  8.             $scope.movies = response.data.movies; 
  9.         }) 
  10.     } 
  11.     $scope.dateTime = new Date().getMinutes(); 
  12.      alert('in controller'); 
  13.     document.getElementById('btnSearch').addEventListener('click', callEventListenerfn); 
  14. function callEventListenerfn(e) { 
  15.         alert("SearchMovieByTitleDigest called without angular scope"); 
  16. var title = $scope.searchByTitle; 
  17.         alert(title); 
  18.         $scope.$watch('searchByTitle', function (newValue, oldValue) { 
  19.             $scope.searchByTitle = newValue; 
  20.             console.log("$scope.searchByTitle value changed " + $scope.searchByTitle); 
  21. // alert($scope.searchByTitle);
  22.         }); 
  23.         $http.jsonp("http://api.myapifilms.com/imdb/idIMDB?title=" + $scope.searchByTitle + "&token=2gr44c9e-203f-4a6f-91d0-o6121&format=json&language=en-us&aka=0&business=0&seasons=0&seasonYear=0&technical=0&filter=2&exactFilter=0&limit=5&forceYear=0&trailers=0&movieTrivia=0&awards=0&moviePhotos=0&movieVideos=0&actors=0&biography=0&uniqueName=0&filmography=0&bornAndDead=0&starSign=0&actorActress=0&actorTrivia=0&similarMovies=0&adultSearch=0&goofs=0"es=0&fullSize=0&companyCredits=0&callback=JSON_CALLBACK") 
  24.           .success(function (response) { 
  25.               alert($scope.searchByTitle); 
  26.               $scope.movies = response.data.movies; 
  27.               $timeout(function () { 
  28.                     $scope.$digest(); 
  29.               }, 100); 
  30.           }) 
  31. // });
  32.     } 
  33. }]);  

Hope, it’ll help you some day. Enjoy coding.

You can download source code from here:

Download source code form here

Tuesday, August 16, 2016

 $digest already in progress when calling $scope.$apply() in AngularJS

I was getting this error during i made call to a third-party library to access data on their servers, so I can't take advantage of $http, nor do I want to since I would have to rewrite their library to use $http.

$http.jsonp(http://api.myapifilms.com/imdb/idIMDB?title=” “).success(function (response) {
             alert($scope.searchByTitle);           
             $scope.movies = response.data.movies;

  $scope.$digest();

// If i write above $digest method directly i thrown me an error though if i put it into little diff form than it works fine.
$timeout(function () {
                   $scope.$digest();
             }, 100);

 

Reason behind this is ,$timeout function takes this execution as async request.

Thanks

Monday, August 1, 2016

 

AngularJS And ASP.NET MVC Movie Library Application - Integration Of IMDB Movie API - Part Fiv

DotnetPiper_Angular

Moving ahead, in this article, we’ll focus on the integration of live movie API within an existing application.
Kindly open the given URL and register yourself. After registering, you will get a token which we’ll be using in this article to retrieve the information/data from API.
http://api.myapifilms.com/imdb
Once you register yourself, you should receive an email like the given image, with some token value.
value
Open the website with the link, shared above, and fill in the details, as shown below in the following images.
emails
emails
As soon as you click on the submit button, you should receive a response in JSON format, as given below:
response
You may also get XML response for just making amendments either in request or in format dropdown, as shown below:
request
So far so good. We are now able to use this API URL within our application.
Open you solution and find routing.js file to add a new Controller into this, as give below:
solution

  1. routingApp.controller("ApiMovieController", ['$scope', '$http', '$timeout', function ($scope, $http, $timeout) { 
  2.     $scope.SearchMovieByTitle = function () { 
  3. var title = $scope.searchByTitle; 
  4.         alert(title); 
  5.         $http.jsonp("http://api.myapifilms.com/imdb/idIMDB?title=" + title + "&token=5bf98789787hghjg4&format=json&language=en-us&aka=0&business=0&seasons=0&seasonYear=0&technical=0&filter=2&exactFilter=0&limit=5&forceYear=0&trailers=0&movieTrivia=0&awards=0&moviePhotos=0&movieVideos=0&actors=0&biography=0&uniqueName=0&filmography=0&bornAndDead=0&starSign=0&actorActress=0&actorTrivia=0&similarMovies=0&adultSearch=0&goofs=0"es=0&fullSize=0&companyCredits=0&callback=JSON_CALLBACK").success(function (response) { 
  6.             console.log(response); 
  7.             $scope.movies = response.data.movies; 
  8.         }) 
  9.     }]); 

Kindly, put your token value in the above http request, in order to get the correct result.
Note: If you have noticed, in the above code segment, you have injected a dependency $http and $timeout. For now, only concentrate on the $http and forget about $timeout.
code
Complete code for routing.js main JavaScript file is shown below:
Code Routing.js file

  1. /// <reference path="../Scripts/angular.js" />
  2. /// <reference path="../Scripts/fusioncharts.js" />
  3. /// <reference path="../Scripts/fusioncharts.charts.js" />
  4. /// <reference path="DataService.js" />
  5. /// <reference path="../Scripts/angular-route.js" />
  6. var routingApp = angular.module('routingApp', ['ngRoute']); 
  7. routingApp.directive("login", function () { 
  8. var directive = {}; 
  9. //restrict = E, signifies that directive is Element directive
  10.     directive.restrict = 'E'; 
  11. //template replaces the complete element with its text.
  12.     directive.templateUrl = "/Application/Login.html";//"My first directive";
  13. return directive; 
  14. }); 
  15. routingApp.config(['$routeProvider', function ($routeProvider) { 
  16. //alert("Route Initiated");
  17.     $routeProvider. 
  18. // when('/Home', { templateUrl: '/Application/login.html', controller: 'DotnetPiperController' }).
  19.         when('/Movie', { templateUrl: '/Application/Movie.html', controller: 'MovieController' }). 
  20.         when('/SearchMovie', { templateUrl: '/Application/SearchMovie.html', controller: 'ApiMovieController' }). 
  21.          when('/Tolly', { templateUrl: '/Application/Tollywood.html', controller: 'tollyController' }). 
  22.         otherwise({ redirectTo: '' }); 
  23. }]); 
  24. routingApp.controller("tollyController", function ($scope) { 
  25.     $scope.tollyMessage = "Welcome to TollyWood to watch Action,Thriller and Suspence movies"; 
  26. }); 
  27. routingApp.controller("MovieController", ['$scope', function ($scope) { 
  28.     $scope.edit = false; 
  29.     $scope.message = "Welcome to DotnetPiper.com to learn Angular"; 
  30.     $scope.error = false; 
  31.     $scope.clear = false; 
  32.     $scope.success = false; 
  33. // alert("Servcie Called");
  34. var movies = [ 
  35.                 { title: "Revenent", year: "2015", rating: "5Star", plot: " A revenger Journey" }, 
  36.                  { title: "Counjouring2", year: "2016", rating: "4Star", plot: " A Complete Hourror" }, 
  37.                  { title: "DDLJ", year: "1995", rating: "SuperStar", plot: "Romantic love story" }, 
  38.                  { title: "Sultan", year: "2016", rating: "5Star", plot: "A Warrior" }, 
  39.                  { title: "BajiRao Mastani", year: "2015", rating: "4.5 Star", plot: "Film of the Year" } 
  40.     ]; 
  41.     $scope.movies = movies; 
  42.     $scope.AddMovie = function (movie) { 
  43. if ($scope.edit == true) { 
  44. var index = $scope.movies.indexOf(movie); 
  45. // alert("edit Called");
  46.             $scope.movies[index] = movie; 
  47. //alert(movie.rating);
  48.             $scope.updatedMovie = movie; 
  49.             $scope.success = true; 
  50.             $scope.movie = {}; 
  51.         } 
  52. else { 
  53. var newMovie = { 
  54.                 title: $scope.movie.title, 
  55.                 year: $scope.movie.year, 
  56.                 rating: $scope.movie.rating, 
  57.                 plot: $scope.movie.plot 
  58.             }; 
  59.             movies.push(newMovie); 
  60. // alert("Add Called");
  61.         } 
  62.     } 
  63.     $scope.DeleteMovie = function (movie, index) { 
  64.         movies.splice(index, 1); 
  65. // $scope.movie = movie;
  66.         $scope.updatedMovie = movie; 
  67.         $scope.success = false; 
  68.         $scope.clear = true; 
  69.         $scope.movie = {}; 
  70.         console.log(index); 
  71.     } 
  72.     $scope.EditMovie = function (movie, index) { 
  73.         $scope.selectedRow = null;  // initialize our variable to null
  74.         $scope.selectedRow = index; 
  75.         $scope.movie = movie; 
  76.         $scope.edit = true; 
  77.     } 
  78. }]); 
  79. routingApp.controller("ApiMovieController", ['$scope', '$http', '$timeout', function ($scope, $http, $timeout) { 
  80.     $scope.SearchMovieByTitle = function () { 
  81. var title = $scope.searchByTitle; 
  82.         alert(title); 
  83.         $http.jsonp("http://api.myapifilms.com/imdb/idIMDB?title=" + title + "&token=5bf94c9e-203f-4a6f-91d0-a63a59a77084&format=json&language=en-us&aka=0&business=0&seasons=0&seasonYear=0&technical=0&filter=2&exactFilter=0&limit=5&forceYear=0&trailers=0&movieTrivia=0&awards=0&moviePhotos=0&movieVideos=0&actors=0&biography=0&uniqueName=0&filmography=0&bornAndDead=0&starSign=0&actorActress=0&actorTrivia=0&similarMovies=0&adultSearch=0&goofs=0"es=0&fullSize=0&companyCredits=0&callback=JSON_CALLBACK").success(function (response) { 
  84.             console.log(response); 
  85.             $scope.movies = response.data.movies; 
  86.         }) 
  87.     } 
  88.     $scope.dateTime = new Date().getMinutes(); 
  89. // alert($scope.dateTime);
  90.     document.getElementById("btnSearch").addEventListener('click', function SearchMovieByTitleDigest() { 
  91. var title = $scope.searchByTitle; 
  92.         $scope.$watch("searchByTitle", function (newValue, oldValue) { 
  93.             $scope.searchByTitle = newValue; 
  94.             console.log("$scope.searchByTitle Called " + $scope.searchByTitle); 
  95.             alert($scope.searchByTitle); 
  96.         }); 
  97. //console.log(title);
  98. //alert(title);
  99.         $http.jsonp("http://api.myapifilms.com/imdb/idIMDB?title=" + $scope.searchByTitle + "&token=5bc9e-203f-4a6f-91d0-a63a59de4222&format=json&language=en-us&aka=0&business=0&seasons=0&seasonYear=0&technical=0&filter=2&exactFilter=0&limit=5&forceYear=0&trailers=0&movieTrivia=0&awards=0&moviePhotos=0&movieVideos=0&actors=0&biography=0&uniqueName=0&filmography=0&bornAndDead=0&starSign=0&actorActress=0&actorTrivia=0&similarMovies=0&adultSearch=0&goofs=0"es=0&fullSize=0&companyCredits=0&callback=JSON_CALLBACK") 
  100.             .success(function (response) { 
  101.                 $scope.movies = response.data.movies; 
  102.                 $timeout(function () { 
  103.                     $scope.$digest(); 
  104.                 }, 100); 
  105.             }) 
  106.     }); 
  107. //document.getElementById("btnSearch").addEventListener('click', function () {
  108. //                console.log("Seach Started");
  109. //                alert("Seach Started");
  110. //                $scope.dateTime = new Date().getMinutes();
  111. //                $scope.$digest();
  112. //            });
  113. }]); 

We are almost done with our Controller code part. It's now turn to create the UI to meet our purpose.
Kindly open your solution and add searchMovie.html file, as shown below in the screenshot:
searchMovie
Please copy and paste the following code in searchMovie.html partial template.
Code for searchMovie.html file,

  1. <!DOCTYPE html>
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <h2>Seach Movie Using IMDB API</h2>
  5. <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
  6. <style>
  7.         .selected 
  8.         { 
  9.             background-color: lightyellow; 
  10.             color: red; 
  11.             font-weight: bold; 
  12.         } 
  13. </style>
  14. </head>
  15. <body ng-app="routingApp" class="jumbotron">
  16. <div ng-controller="ApiMovieController" class="container">
  17.         <!--<div ng-show="success" class="alert-success">Record has been upddated for movie :  {{updatedMovie.title}}</div>
  18. <div ng-show="clear" class="alert-success">Record has been deleted for movie :  {{updatedMovie.title}}</div>-->
  19. <div class="row col-md-8">
  20. <table class="table table-striped ">
  21. <tr>
  22. <td>
  23. <input type="text" ng-model="searchByTitle" class="form-control" style="width: 300px;" />
  24. </td>
  25.                     {{dateTime}} 
  26. <td>
  27. <button type="button" ng-click="SearchMovieByTitle()" class="btn btn-info">Search using Angular Scope 
  28. <span class="glyphicon glyphicon-search"></span>
  29. </button>
  30. <br />
  31. </td>
  32. </tr>
  33. <tr>
  34. <td></td>
  35. <td>
  36. <button type="button" id="btnSearch" class="btn btn-info">Seacrh Movie Using EventListener 
  37. <span class="glyphicon glyphicon-search"></span>
  38. </button>
  39. </td>
  40. </tr>
  41. <tr class="thead-inverse">
  42. <td style="background-color: Highlight">Title</td>
  43. <td style="background-color: Highlight">Year of Release</td>
  44. <td style="background-color: Highlight">Rating</td>
  45. <td style="background-color: Highlight">Plot</td>
  46. <td style="background-color: Highlight">Actions</td>
  47. </tr>
  48. <tbody>
  49. <tr ng-repeat="movie in movies" ng-class="{'selected':$index == selectedRow}">
  50. <td>{{movie.title}} 
  51. </td>
  52. <td>{{movie.year}} 
  53. </td>
  54. <td>{{movie.rating}} 
  55. </td>
  56. <td>{{movie.plot }} 
  57. </td>
  58. <td></td>
  59. </tr>
  60. </tbody>
  61. </table>
  62. </div>
  63. </div>
  64. </body>
  65. </html>

Once you paste the above code segment, run an application and click on Search Movie Globally.
Note: Ensure that you had implemented the routing, as shown in the below URL,

The output will be, as depicted below:
output
Mapping of the above textbox search, using Angular Scope. Whatever value we put into the textbox, ApiMovieController reads that value using scope and passes into http request as Title, as depicted in the screenshot below:
code
Now, search for the movie as I’ve done for The Revenant and Sultan, both.
revenent
sultan
Kindly refer tothe given screen for full fledged movie search operation.
output
Hope it’ll help you some day. Enjoy Coding.