فیلتر، مرتب سازی و انیمیشن AngularJS با استفاده از MVC و WCF Rest

سه شنبه 27 بهمن 1394

در این مقاله با جزئیات نشان خواهیم داد چگونه می توان یک فیلتر ، مرتب سازی و انیمیشن ساده AngularJs را با استفاده از MVC و سرویس WCF Rest ایجاد کرد.

فیلتر، مرتب سازی و انیمیشن AngularJS با استفاده از MVC و WCF Rest

در این مقاله با جزئیات نشان خواهیم داد چگونه می توان یک فیلتر ، مرتب سازی و انیمیشن ساده  AngularJs  را با استفاده از  MVC و سرویس  WCF Rest  ایجاد کرد.

1. چگونه می توان یک سرویس  WCF Rest  ایجاد و داده ها را از دیتابیس بازیابی کرد.

 در صورت تمایل میتوانید به صورت رایگان آموزش WCF به همراه پروژه عملی را در سایت تاپ لرن مشاهده کنید .

2. چگونه می توان AngularJS Pakage را در اپلیکیشن های  MVC نصب کرد.

3. چگونه می توان اپلیکیشن AngularJS را برای ایجاد  Master Detail Grid  خود ایجاد کنیم.

4. چگونه می توان از سرویس  WCF در  AngularJS برای استفاده  فیلتر و مرتب سازی و انیمیشن استفاده کرد.   

برنامه های  Service-oriented

 WCF  یک فریم ورک برای ایجاد برنامه های  Service-oriented  است. در این برنامه ها با استفاده از یک پروتکل ، سرویس می تواند بر روی یک شبکه به اشتراک گذاشته شده و استفاده شود.

برای مثال اگر توابع دیتابیسی معمولی داشته باشیم که در چندین پروژه از آنها استفاده می شود و این پروژه ها در جاهای مختلفی قرار داشته باشند و توسط اینترنت متصل باشند، در این وضعیت می توانیم یک سرویس  WCF ایجاد کنیم و توابع مورد نظر را در آن بنویسیم . می توان  WCF را بر روی  IIS توسعه داد و از  Url آن در برنامه های خود استفاده کرد. در بخش کد خواهیم دید که چگونه می توان یک سرویس  WCF REST ایجاد و از آن در برنامه های  AngularJS استفاده کرد.

AngularJS

 حتما با  Model ,View ,ViewModel یا  MVVM  و  Model ,View ,Controller یا  MVCآشنا هستید .   AngularJS نیز یک فریم ورک  JavaScript است که صرفا بر اساس  HTMl ,CSS و JavaScript  ایجاد شده است.

الگوی AngularJS به صورت  Model View Whatever یا  MVW است که شبیه الگوی  MVC و  MVVM می باشد. در مثال ما این الگو  Model, View,Service  است . در بخش کد خواهید دید که چگونه  AngularJS را در برنامه های  MVC نصب و ایجاد کنید.

در اینجا مثالی را پیاده سازی میکینم که از فیلترینگ ، مرتب سازی و انیمیشن ساده ای در AngularJS استفاده میکند.

Ng-repeat : برای نمایش آرایه ای از داده ها یک به یک در TD جدول یا یک لیست استفاده می شود. فرض کنید می خواهیم داده های  1 تا 10 را نمایش دهیم. معمولا یک  loop را ایجاد میکنیم داده ها را یک به یک نشان دهد یا مقادیر 1تا 10 را به یک آرایه اضافه میکنیمو سپس با یک  Loop نمایش می دهیم. برای استفاده از  looping  و نمایش داده ها یک به یک در  AngularJS از  ng-repeat استفاده می شود.

برای مثال کد زیر را در نظر بگیرید که داده های  1 تا 10 را در یک جدول نمایش می دهد.

<table>  
    <tbody ng-repeat="Numbers in [1, 2, 3, 4,5,6,7,8,9,10] ">  
        <tr>  
            <td>  
                {{Numbers}}  
            </td>  
        </tr>  
    </tbody>  
</table>  

این مثال می تواند با استفاده از آرایه ای از نام ها نیز ایجاد شود.

<table>  
    <tbody ng-repeat="Names in ['sara','ali','farhad','milad','reza','mohammad'] ">  
        <tr>  
            <td>  
                {{Names}}  
            </td>  
        </tr>  
    </tbody>  
</table> 

برای تست این مثال به اضافه کردن angular.js به پوشه روت پروژه احتیاج داریم.

کد کامل شده به صورت زیر می باشد :

همانطور که میبینید ابتدا اسکریپت  angular.js  اضافه شده است.

<html ng-app="MyAngularModule" xmlns="http://www.w3.org/1999/xhtml">  
<head runat="server">  
    <title></title>  
<script src="http://code.angularjs.org/1.2.2/angular.js"></script>  
<script>  
        angular.module('MyAngularModule', [])  
        .controller('myAngularController', function (  
          $scope  
        ) {  
        });  
    </script>  
</head>  
<body ng-controller="myAngularController">  
    <table>  
        <tbody ng-repeat="Numbers in [1, 2, 3, 4,5,6,7,8,9,10] ">  
            <tr>  
                <td>  
                    {{Numbers}}  
                </td>  
            </tr>  
        </tbody>  
    </table>  
    <table>  
        <tbody ng-repeat="Names in ['sara','ali','farhad','milad','reza','mohammad'] "> 
            <tr>  
                <td>  
                    {{Names}}  
                </td>  
            </tr>  
        </tbody>  
    </table>  
</body>  
</html>  

فیلتر

فیلترها می توانند توسط ng-repeat با استفاده از  pipe symbol اضافه شوند. در مثال بالا آرایه ای از نام ها را با استفاده از  ng-repeat نمایش دادیم اکنون می توانیم فیلتر را به آن اضافه کنیم. با استفاده از ng-repeat  فیلترها را اضافه کرده و برای هر فیلتر یک  Textbox Model id قرار می دهیم. هنگامی که کاربر textbox فیلتر را پر کند ،مقدار مناسب در جدول نمایش داده خواهد شد.

ng-repeat="Names in ['sara','ali','farhad','milad','reza','mohammad'] | filter:myNameFilters

کد تکمیل شده به صورت زیر خواهد بود .

<html ng-app="MyAngularModule" xmlns="http://www.w3.org/1999/xhtml">  
<head runat="server">  
    <title></title>  
    <script src="http://code.angularjs.org/1.2.2/angular.js"></script>  
    <script>  
        angular.module('MyAngularModule', [])  
        .controller('myAngularController', function (  
          $scope  
        ) {  
        });  
    </script>  
</head>  
<body ng-controller="myAngularController">  
    Filter By NAme : <input type="text" ng-model="myNameFilters">  
    <table border=1>  
        <tbody ng-repeat="Names in ['sara','ali','farhad','milad','reza','mohammad']  | filter:myNameFilters ">  
            <tr>  
                <td>  
                    {{Names}}  
                </td>  
            </tr>  
        </tbody>  
    </table>  
</body>  
</html>  

مرتب سازی

برای یک فیلتر یک فیلد orderBy اضافه میکنیم که مقدار ng-repeat  را با استفاده از  pipe symbol معکوس میکند. مثلا در جایی که آرایه ای از نام ها را نمایش دادیم توسط ng-repeat با استفاده از pipe symbol فیلتر  orderBy  را به آن اضافه میکنیم که نام ها را به صورت صعودی یا نزولی مرتب میکند.

ng-repeat="nme in Names | filter:myNameFilters | orderBy:predicate:reverse 

کد تکمیل شده به صورت زیر خواهد بود:

<html ng-app="MyAngularModule" xmlns="http://www.w3.org/1999/xhtml">  
<head runat="server">  
    <title></title>  
    <script src="http://code.angularjs.org/1.2.2/angular.js"></script>  
      <script>  
        angular.module('MyAngularModule', [])  
        .controller('myAngularController', function (  
          $scope  
        ) {  
          });  
    </script>  
</head>  
<body ng-controller="myAngularController" ng-init="Names = [{name:'Mohammad'},  
                       {name:'sara'},  
                        {name:'ali'},  
                         {name:'farhad'},  
                         {name:'milad'},  
                        {name:'reza'}]">  
      Filter By NAme : <input type="text" ng-model="myNameFilters">  
    <table border=1>  
        <tr>  
            <td ng-click="predicate = 'name'; reverse=!reverse">  
                <b>Toy Code</b>  
            </td>  
        </tr>  
        <tbody ng-repeat="nme in Names   | filter:myNameFilters  | orderBy:predicate:reverse">  
              <tr>  
                <td>  
                    {{nme.name}}  
                </td>  
            </tr>  
        </tbody>  
    </table>  
</body>  
</html>  

انیمیشن :

برای استفاده از انیمیشن در  AngularJs باید “angular-animate.min.js” را در پروژه قرار دهیم و در ماژول ، پارامتر ngAnimate را پاس دهیم.  کد به صورت زیر خواهد بود:

1. اضافه کردن منابع  :

<script src="http://code.angularjs.org/1.2.2/angular-animate.min.js"></script>  

2. پاس دادن پارمتر در ماژول به صورت ngAnimate  :

angular.module('MyAngularModule', ['ngAnimate']) 

3. اضافه کردن فایل CSS انیمیشن به صفحه  HTML. در اینجا از حالت fade in  و  fade out  برای انیمیشن استفاده شده است.

کد تکمیل شده به صورت زیر است.

<html ng-app="MyAngularModule" xmlns="http://www.w3.org/1999/xhtml">  
<head runat="server">  
    <title></title>  
    <script src="http://code.angularjs.org/1.2.2/angular.js"></script>  
    <script src="http://code.angularjs.org/1.2.2/angular-animate.min.js"></script>  
    <style>  
        .ng-enter
         {  
            -webkit-transition: 1s;  
            transition: 3s;  
            opacity: 0;  
        }  
          .ng-enter-active
       {  
            opacity: 1;  
        }  
          .ng-leave
       {  
            -webkit-transition: 1s;  
            transition: 2s;  
        }  
          .ng-leave-active {  
            opacity: 0;  
        }  
    </style>  
    <script>  
        angular.module('MyAngularModule', ['ngAnimate'])  
        .controller('myAngularController', function (  
          $scope  
        ) {  
        });  
    </script>  
</head>  
<body ng-controller="myAngularController" ng-init="Names = [{name:'Mohammad'},  
                       {name:'sara'},  
                        {name:'ali'},  
                         {name:'farhad'},  
                         {name:'milad'},  
                        {name:'reza'}]">  
      Filter By NAme : <input type="text" ng-model="myNameFilters">  
    <table border=1>  
        <tr>  
            <td ng-click="predicate = 'name'; reverse=!reverse">  
                <b>Toy Code</b>  
            </td>  
        </tr>  
        <tbody ng-repeat="nme in Names   | filter:myNameFilters  | orderBy:predicate:reverse">  
              <tr>  
                <td>  
                    {{nme.name}}  
                </td>  
            </tr>  
        </tbody>  
    </table>  
</body>  
</html>  

ایجاد دیتابیس و جداول

در این بخش قصد داریم به سراغ ایجاد دیتابیس و جدول مورد نظر برویم. یک جدول ToyDetails برای جزئیات اسباب بازی ها در دیتابیس  ToyDB ایجاد میکنیم. از اسکریپت زیر برای ایجاد دیتابیس استفاده میکنیم.

USE MASTER  
GO 

کد زیر چک میکند که اگر دیتابیس وجود دارد ، آن را حذف و دوباره ایجاد کند.

IF EXISTS (SELECT [name] FROM sys.databases WHERE [name] = 'ToysDB' ) 

DROP DATABASE ToysDB  
GO  
  
CREATE DATABASE ToysDB  
GO  
  
USE ToysDB  
GO  

جدول  ToysDetails

کد زیر جدول  ToysDetails را ایجاد میکند. این جدول برای ذخیره اطلاعات اسباب بازیها استفاده می شود.

IF EXISTS ( SELECT [name] FROM sys.tables WHERE [name] = 'ToysDetails' )  
DROP TABLE Professional_Type  
GO  
  
CREATE TABLE ToysDetails  
(  
Toy_ID NVARCHAR(20) NOT NULL,  
Toy_Name NVARCHAR(100) NOT NULL,  
Toy_Price int NOT NULL,  
Image_Name NVARCHAR(100) NOT NULL,  
Item_Date DateTime NOT NULL,  
AddedBy NVARCHAR(100) NOT NULL,  
CONSTRAINT [PK_ToysDetails] PRIMARY KEY CLUSTERED  
(  
[Toy_ID] ASC  
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]  
) ON [PRIMARY]  
  
GO  

از کدهای زیر برای وارد کردن داده هایی به جدول استفاده می شود.

    Insert into ToysDetails(Toy_ID,Toy_Name,Toy_Price,Image_Name,Item_Date,AddedBy) values('Toy001','چرتکه	',250,'Abacus.png',getdate(),'علی')  
    Insert into ToysDetails(Toy_ID,Toy_Name,Toy_Price,Image_Name,Item_Date,AddedBy) values('Toy002','ماهی زرد',350,'Babelfish.png',getdate()-10,'مسعود')  
    Insert into ToysDetails(Toy_ID,Toy_Name,Toy_Price,Image_Name,Item_Date,AddedBy) values('Toy003','توپ بیس بال',1400,'Baseball.png',getdate()-24,'علی')  
    Insert into ToysDetails(Toy_ID,Toy_Name,Toy_Price,Image_Name,Item_Date,AddedBy) values('Toy004','توپ بسکت بال',1390,'BasketballBall.png',getdate()-36,'علی')  
    Insert into ToysDetails(Toy_ID,Toy_Name,Toy_Price,Image_Name,Item_Date,AddedBy) values('Toy005','ماهی آبی',450,'BlueFish.png',getdate()-90,'مسعود')  
    Insert into ToysDetails(Toy_ID,Toy_Name,Toy_Price,Image_Name,Item_Date,AddedBy) values('Toy006','خرس قهوه ای',1250,'BrownBear.png',getdate()-34,'میلاد')  
    Insert into ToysDetails(Toy_ID,Toy_Name,Toy_Price,Image_Name,Item_Date,AddedBy) values('Toy007','ماشین قرمز',950,'CabrioletRed.png',getdate()-20,'میلاد')  
    Insert into ToysDetails(Toy_ID,Toy_Name,Toy_Price,Image_Name,Item_Date,AddedBy) values('Toy008','ماشین زرد',1150,'Chevelot.png',getdate()-26,'علی')  
    Insert into ToysDetails(Toy_ID,Toy_Name,Toy_Price,Image_Name,Item_Date,AddedBy) values('Toy009','اردک',399,'Duck.png',getdate()-44,'مسعود')  
    Insert into ToysDetails(Toy_ID,Toy_Name,Toy_Price,Image_Name,Item_Date,AddedBy) values('Toy010','ماشین آتش نشانی',897,'FireEscape.png',getdate()-12,'مسعود')  
    Insert into ToysDetails(Toy_ID,Toy_Name,Toy_Price,Image_Name,Item_Date,AddedBy) values('Toy011','ماشین کوچک',750,'MiniCar.png',getdate(),'علی')  
    Insert into ToysDetails(Toy_ID,Toy_Name,Toy_Price,Image_Name,Item_Date,AddedBy) values('Toy012','نمو',675,'Nemo.png',getdate()-1,'علی')  
    Insert into ToysDetails(Toy_ID,Toy_Name,Toy_Price,Image_Name,Item_Date,AddedBy) values('Toy013','ماشین قدیمی',1950,'OldCar.png',getdate()-3,'علی')  
    Insert into ToysDetails(Toy_ID,Toy_Name,Toy_Price,Image_Name,Item_Date,AddedBy) values('Toy014','ماشین قرمز جدید',679,'RedCar.png',getdate(),'مسعود')  
    Insert into ToysDetails(Toy_ID,Toy_Name,Toy_Price,Image_Name,Item_Date,AddedBy) values('Toy015','توپ فوتبال',950,'SoccerBall.png',getdate(),'میلاد')  
    Insert into ToysDetails(Toy_ID,Toy_Name,Toy_Price,Image_Name,Item_Date,AddedBy) values('Toy016','توپ تنیس',350,'TennisBall.png',getdate()-29,'مسعود')  
      
      
    select * from ToysDetails  

ایجاد سرویس  WCF REST

در ویژوال استودیو 2013 گزینه  WCF Service Application  را انتخاب میکنیم. بعد از ایجاد سرویس مورد نظر در  Solution دو آیتم   IService.CSو  Service1.svc را مشاهده میکنید.

در  IService.CS می توانیم سه قرارداد را به صورت پیش فرض ببینیم.

[ServiceContract] متدها یا هر عمل موجودی را برای سرویس تعریف میکند.  یک اینترفیس است و و متدها می توانند درون اینترفیس سرویس با استفاده از صفت  Operation Contract تعریف شوند.

[OprationContract] شبیه  Web service  یا  WebMethod است .

[DataContract] تبادل داده ها بین سرویس گیرنده و سرویس را تعریف میکند.

Service Contract

کد زیر به صورت خودکار برای همه فایل های  IService.csایجاد می شود. می توانیم کد خود را در آن بنویسیم.

public interface IService1  
   {  
  
       [OperationContract]  
       string GetData(int value);  
  
       [OperationContract]  
       CompositeType GetDataUsingDataContract(CompositeType composite);  
  
       // TODO: Add your service operations here  
   }  
   // Use a data contract as illustrated in the sample below to add composite types to service operations.  
   [DataContract]  
   public class CompositeType  
   {  
       bool boolValue = true;  
       string stringValue = "Hello ";  
  
       [DataMember]  
       public bool BoolValue  
       {  
           get { return boolValue; }  
           set { boolValue = value; }  
       }  
  
       [DataMember]  
       public string StringValue  
       {  
           get { return stringValue; }  
           set { stringValue = value; }  
       }  
   }  

DataContract

در مثال ما لازم است تا تمام جزئیات اسباب بازی ها دریافت شود. بنابراین یک  Data Contract با نام  ToyItemDataContract  را ایجاد میکنیم. در اینجا می توانید نام ستونهای جدول را به عنوان  Data Member ببینید.

public class ToysDetailDataContract  
    {  
        [DataContract]  
        public class ToyItemDataContract  
        {  
            [DataMember]  
            public string Toy_ID { get; set; }  
  
            [DataMember]  
            public string Toy_Name { get; set; }  
  
            [DataMember]  
            public string Toy_Price { get; set; }  
  
            [DataMember]  
            public string Image_Name { get; set; }  
  
            [DataMember]  
            public string Item_Date { get; set; }  
  
            [DataMember]  
            public string AddedBy { get; set; }  
        }  
  
    }  

در  OperationContract  دو آیتم  WebInvoke  و  WebGet رامی توانیم مشاهده کنیم که داده ها را از دیتابیس در  سرویس REST بازیابی میکنند.

RequestFormat = WebMessageFormat.Json,  
ResponseFormat = WebMessageFormat.Json, 

برای فرمت درخواست و پاسخ از  JSON استفاده شده است.

JSON مخفف  JavaScript Object Notation است. یک فرمت تبادل داده سبک است.

UriTemplate نام متد ماست و نوع بازگشتی متد به صورت  List  است.

متد  GetToyDetails برای دریافت همه اسباب بازی ها از دیتابیس استفاده می شود.

[ServiceContract]  
    public interface IService1  
    {  
[OperationContract]  
        [WebInvoke(Method = "GET",  
           RequestFormat = WebMessageFormat.Json,  
           ResponseFormat = WebMessageFormat.Json,  
           UriTemplate = "/GetToyDetails/")]  
        List<ToysDetailDataContract.ToyItemDataContract> GetToyDetails();
    }  

در زیر کد کامل IService.cs را مشاهده میکنید.

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Runtime.Serialization;  
using System.ServiceModel;  
using System.ServiceModel.Web;  
using System.Text;  
  
namespace Shanu_AngularJsFilterWcfService  
{.  
     [ServiceContract]  
    public interface IService1  
    {  
        [OperationContract]  
        [WebInvoke(Method = "GET",  
           RequestFormat = WebMessageFormat.Json,  
           ResponseFormat = WebMessageFormat.Json,  
           UriTemplate = "/GetToyDetails/")]  
        List<ToysDetailDataContract.ToyItemDataContract> GetToyDetails();   
    }  
    public class ToysDetailDataContract  
    {  
        [DataContract]  
        public class ToyItemDataContract  
        {  
            [DataMember]  
            public string Toy_ID { get; set; }  
  
            [DataMember]  
            public string Toy_Name { get; set; }  
  
            [DataMember]  
            public string Toy_Price { get; set; }  
  
            [DataMember]  
            public string Image_Name { get; set; }  
  
            [DataMember]  
            public string Item_Date { get; set; }  
  
            [DataMember]  
            public string AddedBy { get; set; }  
        }  
  
    }  
}  

اضافه کردن دیتابیس با استفاده از  ADO.net Entity Data Model

بر روی پروژه  WCF  خود کلیک راست کرده و از قسمت  Add New Item  ، گزینه  ADO.net Entity Data Model را انتخاب کنید.

پس از آن  EF Designer from Database را انتخاب کنید.

بر روی  New Connection کلیک کنید.

در این قسمت دیتابیس خود را انتخاب کرده و جداول مورد نظر را به مدل اضافه میکنیم.

Service1..svc

در این بخش اینترفیس  IService  را پیاده سازی کرده و همه متد های Operation Contract  را باز نویسی میکنیم.

  public class Service1 : IService1
    {
        ToysDBEntities2 OME;

        public Service1()
        {
            OME = new ToysDBEntities2();
        }

        // This method is get the Toys details from Db and bind to list  using the Linq query
        public List<ToysDetailDataContract.ToyItemDataContract> GetToyDetails()
        {
            var query = (from a in OME.ToysDetails
                         select a).Distinct();

            List<ToysDetailDataContract.ToyItemDataContract> ToyDetailList = new List<ToysDetailDataContract.ToyItemDataContract>();

            query.ToList().ForEach(rec =>
            {
                ToyDetailList.Add(new ToysDetailDataContract.ToyItemDataContract
                {
                    Toy_ID = rec.Toy_ID,
                    Toy_Name = rec.Toy_Name,
                    Toy_Price = Convert.ToString(rec.Toy_Price),
                    Image_Name = rec.Image_Name,
                    Item_Date = Convert.ToString(rec.Item_Date),
                    AddedBy = rec.AddedBy

                });
            });
            return ToyDetailList;
        }
       
    }

Web.Config

در پروژه های  WCF، بخش  Web.config  به صورت زیر می باشد:

1. تغییر  <add binding=”basicHttpsBinding” scheme=”https”/> به  <add binding=”webHttpBinding” scheme=”http”/>

2. تغییر  behavior  به :

<behavior>
     <endpointBehaviors>
          <webHttp helpEnabled="True"/>  
        </behavior>  
    </endpointBehaviors>  
</behaviors>  

اجرای سرویس WCF :

به سراغ اجرا و تست  سرویس  WCF خود می رویم. در URL سرویس خود می توانیم نام متد را اضافه کنیم و نتیجه داده ها را از دیتابیس به صورت  JSON ببینیم.

ایجاد برنامه  MVC

 می توانیم پروژه جدیدی به پروژه فعلی خود اضافه کنیم و یک MVC web application با راست کلیک بر روی  Solution و انتخاب گزینه  Add New Project ایجاد کنیم.

 MVCرا انتخاب کرده و OK کنید.

حالا وقت اضافه کردن سرویس  WCF و نصب پکیج  AngularJS به  Solution  ماست.

با کلیک راست بر روی پروژه  MVC و انتخاب گزینه  Add بر روی  Service  Reference  کلیک کنید.

URL سرویس  WCF خود را وارد کرده و بر روی  GO کلیک کنید.

با موفقیت سرویس  WCF به برنامه  MVC اضافه می شود.

روند نصب پکیج  AngularJS

بر روی پروژه  MVC کلیک راست کرده و  Manage NuGet Pakage را انتخاب کنید.

گزینه  Onlineرا انتخاب کرده و  AngularJS را جستجو کنید. آن را انتخاب و نصب کنید.

 AngularJS به پروژه اضافه شد. اکنون وقت ایجاد آن است.

. Modules.js

. Controllers.js

. Services.js

روند ایجاد فایلهای اسکریپت  AngularJS

بر روی پوشه  Script راست کلیک کرده و یک پوشه جدید برای ایجاد  AngularJs Model/Controller  و سرویس JavaScript  اضافه میکنیم. در این پوشه سه فایل  JavaScript  با نام های  Modules.js ، Controller.js و  Service.js به صورت زیر اضافه کنید.

Modules.js  : در اینجا منابع را برای  Angular.js JavaScript اضافه میکنیم. در برنامه خود از  AngularJs animation نیز استفاده خواهیم کرد. برای استفاده از آن باید  angular-animate.js  و  angular-animate.min.js را اضافه کنیم. نام ماژول خود را  RESTClientModule قرار دادیم و برای استفاده از animation لازم است تا پارمتری به مازول با عنوان ngAnimate پاس داده شود.

/// <reference path="../angular.js" />  
/// <reference path="../angular.min.js" />  
/// <reference path="../angular-animate.js" />  
/// <reference path="../angular-animate.min.js" />  
var app;  
(function ()  
{  
    app = angular.module("RESTClientModule", ['ngAnimate']);  
})();  

Sevice.js  : در اینجا هم منابع را برای  Angular.js  و  Module.js  اضافه میکنیم.

یک نام برای سرویس خود فراهم کرده و از این نام در Controller.js استفاده میکنیم. برای سرویس  Angular خود نام را  AngularJs_WCFService قرار دادیم. در متد ،  URL سرویس  WCF خود را پاس داده ایم.

/// <reference path="../angular.js" />  
/// <reference path="../angular.min.js" />  
/// <reference path="../angular-animate.js" />  
/// <reference path="../angular-animate.min.js" />  
/// <reference path="Modules.js" />  
  
app.service("AngularJs_WCFService", function ($http)  
{  
     //Get Order Master Records  
     this.GetToyDetails = function ()  
{  
   return $http.get("http://localhost:5029/Service1.svc/GetToyDetails/");  
};  
  
});  

Controller.js  : در اینجا منابع را برای  Angular.js JavaScript ، Module.js و  Service.js اضافه میکنیم. همانند سرویس ها برای کنترلر نیز نامی را قرار دادیم،  AngularJs_WCFController

  در کنترلر همه منطق های کاری و بازگرداندن داده از داده های  WCF JSON به صفحه  MVC HTML را اجرا میکنیم.

Variable declarations .1 : ابتدا متغیرهای محلی که استفاده می شوند را اعلان میکنیم . و برای تاریخ جاری و ذخیره تاریخ از  $scope.date استفاده میکنیم.

Methods .2  : متد  GetToyDetails()  برای دریافت جزئیات اسباب بازیها از  JSON و اتصال نتیجه به صفحه اصلی استفاده می شود.

$scope.showImage=function(imgeNm,ToyCode,ToyNAme,ToyPrize,animatval) .3

وقتی که ماوس بر روی صفحه حرکت داده شود به هر آیتم که برسد عکس و جزئیات آن نمایش داده خواهد شد .در این متد از مقدار بولین  $scope.showAnim برای افکت fade in/fade out برای نمایش جزئیات استفاده کردیم .

/// <reference path="../angular.js" />    
/// <reference path="../angular.min.js" />     
/// <reference path="../angular-animate.js" />     
/// <reference path="../angular-animate.min.js" />     
/// <reference path="Modules.js" />     
/// <reference path="Services.js" />     
  
app.controller("AngularJs_WCFController", function ($scope,$timeout, $rootScope, $window, AngularJs_WCFService) {  
    $scope.date = new Date();  
 //  To show and Hide the Table to display  Character Type Selection and Question  
    var firstbool = true;    
    $scope.Imagename = "";  
    $scope.ToyCode = "";  
    $scope.ToyName = "";  
    $scope.ToyPrize = "";  
    $scope.showAnim = true;  
  
GetToyDetails();  
    //To Get All Records     
    function GetToyDetails()
      {  
        var promiseGet = AngularJs_WCFService.GetToyDetails();  
        promiseGet.then(function (pl) {  
            $scope.getToyDetailsDisp = pl.data  
            if($scope.getToyDetailsDisp.length>0)  
               {                 
                   $scope.Imagename = $scope.getToyDetailsDisp[0].Image_Name;  
                   $scope.ToyCode = $scope.getToyDetailsDisp[0].Toy_ID;  
                   $scope.ToyName = $scope.getToyDetailsDisp[0].Toy_Name;  
                   $scope.ToyPrize = $scope.getToyDetailsDisp[0].Toy_Price;                 
              }  
            else  
{  
                $scope.Imagename = "";  
                $scope.ToyCode ="";  
                $scope.ToyName = "";  
                $scope.ToyPrize = "";  
            }  
        },  
             function (errorPl)  
    {  
             });  
    }  
    $scope.showImage = function (imageNm, ToyCode, ToyName, ToyPrize,animatval) {  
        $scope.Imagename = imageNm;  
        $scope.ToyCode = ToyCode;  
        $scope.ToyName = ToyName;  
        $scope.ToyPrize = ToyPrize;       
        if(animatval==1)  
        {            
            $scope.showAnim = false;             
        }  
        else  
        {  
            $scope.showAnim = true;              
        }         
    }});  

ایجاد  Controller و  Viewدر  MVC

حالا به سراغ  MVCرفته و برای نمایش نتیجه Controller  و View  را برای آن ایجاد میکنیم. برای اضافه کردن کنترلر آن را به صورت  Empty  ایجاد میکنیم.

بر روی index  موجود در کنترلر راست کلیک کرده و  View  را اضافه میکنیم.

در  Angularjs  از {{ }}  برای اتصال یا نمایش داده ها استفاده میکنیم. ابتدا یک جدول ایجاد میکنیم. در آن از data-ng-controller=”AngularJs_WcfController” استفاده کردیم که برای اتصال داده از کنترلر به جدول  HTML ما استفاده می شود. در این جدول عناصری به شرح زیر وجود دارند.

 . Data Bind با استفاده از  Data-ng-repeat و فیلترهای اضافه شده و  OrderBy به منظور اجرای فیلترینگ و مرتب سازی برای نمایش داده ها استفاده می شود.

<tbody data-ng-repeat="detail in getToyDetailsDisp | filter:search | orderBy:predicate:reverse" ng-animate="{enter: 'animate-enter', leave: 'animate-leave'}">  

. استفاده از  TextBox برای فیلتر کردن ستونها بر اساس نام آنها به صورت زیر انجام می شود:

<input ng-model="search.Toy_ID" style="width:100px">  
<input ng-model="search.Toy_Name" >  

 . هنگامی که یک کاربر بر روی Head یک ستون کلیک میکند با استفاده از رویداد ng-click داده های آن ستون مرتب می شوند.

<td ng-click="predicate = 'Toy_Name'; reverse=!reverse">  
       <b>نام اسباب بازی</b>  
 </td>  

. Image Mouse Over  و رویداد  Mouse برای نمایش تصویر جزئیات همراه با انیمیشن.

<img src="~/Images/Thumb/{{detail.Image_Name}}" alt="{{detail.Toy_Name}}" ng-mouseover="showImage(detail.Image_Name,detail.Toy_ID,detail.Toy_Name,detail.  
Toy_Price,1)" ng-mouseleave="showImage(detail.Image_Name,detail.Toy_ID,detail.Toy_Name,  
detail.Toy_Price,2)">  

در  Detail image  کدها به صورت زیر است:

<div >  
     <div class="animate-show" ng-show="showAnim">  
         <img alt="" src="~/Images/Actual/{{Imagename}}" />  
      </div>                                 
  </div>  

کد کامل شده این  View  به صورت زیر خواهد بود :

<style type="text/css">
    .ng-enter 
      {
          -webkit-transition: 1s;
          transition: 1s;
          opacity:0;
      }
      .ng-enter-active 
      {
            -webkit-transition: 1s;
          transition: 1s;
          opacity:1;
      }
 
 
      .ng-leave 
      {
          -webkit-transition: 1s;
          transition: 1s;
      }
      .ng-leave-active 
      {
          opacity:0;
      }


      .animate-show {
 
  opacity: 1;

}

.animate-show.ng-hide-add.ng-hide-add-active,
.animate-show.ng-hide-remove.ng-hide-remove-active {
  -webkit-transition: all linear 0.5s;
  transition: all linear 0.5s;
}

.animate-show.ng-hide {
  opacity: 0;
}



</style>

<html data-ng-app="RESTClientModule">

@{
    ViewBag.Title = "فیلترینگ و مرتب سازی در  Angular JS";
}


<body>
    <img src="~/Images/blank.gif" alt="" width="1" height="10" />
    <table width="99%" style=" border-bottom:3px solid #3273d5;">
        <tr>

            <td width=" 250">
                <table width="99%">
                    <tr>
                        <td>
                             {{'علی'}}  خوش آمدید 

                        </td>


                    </tr>
                </table>
            </td>
            <td class="style1" align="center">
               
                <h3><a href="http://barnamenevisan.org/">مرجع تخصصی برنامه نویسان</a></h3>

            </td>
            <td align="right">
                <div ng-controller="AngularJs_WCFController">
                    تاریخ امروز:
                    {{date | date:'yyyy-MM-dd'}}
                </div>

            </td>
        </tr>
    </table>
    <img src="~/Images/blank.gif" alt="" width="1" height="10" />

    <table id="tblContainer" data-ng-controller="AngularJs_WCFController" style='width: 99%;table-layout:fixed;'>
        <tr>
            <td >
                <table style=" background-color:#FFFFFF; border: solid 2px #6D7B8D; padding: 5px;width: 99%;table-layout:fixed;" cellpadding="2" cellspacing="2">
                    <tr style="height: 30px; background-color:#336699 ; color:#FFFFFF ;border: solid 1px #659EC7;">
                        <td >
                            تصویر اسباب بازی
                        </td>
                        <td>
                            جزئیات
                        </td>
                    </tr>
                    <tr style="height: 30px; background-color:#FFFFFF ; color:#336699 ;border: solid 1px #659EC7;">
                        <td >

                            
                           
                            <div >
                                <div class="check-element animate-show" ng-show="showAnim">
                                   <img alt="" src="~/Images/Actual/{{Imagename}}" />
                                </div>
                               
                            </div>
                           
                        </td>
                        <td>
                            <h3 style="color:#9F000F"> کد اسباب بازی : <b>{{ToyCode}} </b></h3><br />
                            <h3 style="color:#9F000F"> نام اسباب بازی : <b>{{ToyName}} </b></h3><br />
                            <h3 style="color:#9F000F"> قیمت اسباب بازی : <b>{{ToyPrize}} </b></h3><br />    

                        </td>
                    </tr>
                </table>


            </td>
        </tr>
        <tr>

            <td>
                <table style=" background-color:#FFFFFF; border: solid 2px #6D7B8D; padding: 5px;width: 99%;table-layout:fixed;" cellpadding="2" cellspacing="2">

                    <tr style="height: 30px; background-color:#336699 ; color:#FFFFFF ;border: solid 1px #659EC7;">
                        <td width="40" align="center">
                        <b>تصویر</b>
                        </td>

                        <td width="40" align="center" style="border: solid 1px #FFFFFF; padding: 5px;table-layout:fixed;cursor: pointer;" ng-click="predicate = 'Toy_ID'; reverse=!reverse">

                            <b>کد اسباب بازی</b>
                        </td>

                        <td width="120" align="center" style="border: solid 1px #FFFFFF; padding: 5px;table-layout:fixed;cursor: pointer;" ng-click="predicate = 'Toy_Name'; reverse=!reverse">
                            <b>نام </b>
                        </td>

                        <td width="40" align="center" style="border: solid 1px #FFFFFF; padding: 5px;table-layout:fixed;cursor: pointer;" ng-click="predicate = 'Toy_Price'; reverse=!reverse">
                            <b>قیمت </b>
                        </td>

                        <td width="90" align="center" style="border: solid 1px #FFFFFF; padding: 5px;table-layout:fixed;cursor: pointer;" ng-click="predicate = 'Item_Date'; reverse=!reverse">
                            <b>تاریخ </b>
                        </td>

                        <td width="90" align="center" style="border: solid 1px #FFFFFF; padding: 5px;table-layout:fixed;cursor: pointer;" ng-click="predicate = 'AddedBy'; reverse=!reverse">
                            <b>نام کاربری</b>
                        </td>

                    </tr>
                    <tr style="height: 30px; background-color:#336699 ; color:#FFFFFF ;border: solid 1px #659EC7;">
                        <td width="40" align="center">
                           فیلتر توسط ->
                        </td>

                        <td width="40" style="border: solid 1px #FFFFFF; padding: 5px;table-layout:fixed;">

                            <input ng-model="search.Toy_ID" style="width:100px">
                        </td>

                        <td width="120" align="center" style="border: solid 1px #FFFFFF; padding: 5px;table-layout:fixed;">
                            <input ng-model="search.Toy_Name">
                        </td>

                        <td width="40" align="center" style="border: solid 1px #FFFFFF; padding: 5px;table-layout:fixed;">

                        </td>

                        <td width="90" align="center" style="border: solid 1px #FFFFFF; padding: 5px;table-layout:fixed;">
                            <input ng-model="search.Item_Date">
                        </td>

                        <td width="90" align="center" style="border: solid 1px #FFFFFF; padding: 5px;table-layout:fixed;">
                            <input ng-model="search.AddedBy">
                        </td>

                    </tr>

                    <tbody data-ng-repeat="detail in getToyDetailsDisp | filter:search  | orderBy:predicate:reverse" ng-animate="{enter: 'animate-enter', leave: 'animate-leave'}">

                        <tr>
                            <td align="center" style="border: solid 1px #659EC7; padding: 5px;table-layout:fixed;">
                                <span style="color:#9F000F">
                                    <img src="~/Images/Thumb/{{detail.Image_Name}}" alt="{{detail.Toy_Name}}" ng-mouseover="showImage(detail.Image_Name,detail.Toy_ID,detail.Toy_Name,detail.Toy_Price,1)"
                                         ng-mouseleave="showImage(detail.Image_Name,detail.Toy_ID,detail.Toy_Name,detail.Toy_Price,2)">
                                </span>

                            </td>
                            <td style="border: solid 1px #659EC7; padding: 5px;table-layout:fixed;">
                                <span style="color:#9F000F">
                                    {{detail.Toy_ID}}
                                </span>

                            </td>

                            <td style="border: solid 1px #659EC7; padding: 5px;table-layout:fixed;">
                                <span style="color:#9F000F">
                                    {{detail.Toy_Name}}
                                </span>

                            </td>

                            <td align="right" style="border: solid 1px #659EC7; padding: 5px;table-layout:fixed;">
                                <span style="color:#9F000F">
                                    {{detail.Toy_Price}}
                                </span>

                            </td>

                            <td style="border: solid 1px #659EC7; padding: 5px;table-layout:fixed;">
                                <span style="color:#9F000F">
                                    {{detail.Item_Date}}
                                </span>

                            </td>

                            <td style="border: solid 1px #659EC7; padding: 5px;table-layout:fixed;">
                                <span style="color:#9F000F">
                                    {{detail.AddedBy}}
                                </span>

                            </td>
                        </tr>

</table>

            </td>



        </tr>

       


    </table>
    <img src="~/Images/blank.gif" alt="" width="1" height="10" />


</body>

</html>

<script src="~/Scripts/angular.js"></script>
<script src="~/Scripts/angular-animate.js"></script>
<script src="~/Scripts/angular-animate.min.js"></script>
<script src="~/Scripts/angular.min.js"></script>

<script src="~/Scripts/shanuAngularScript/Modules.js"></script>

<script src="~/Scripts/shanuAngularScript/Services.js"></script>

<script src="~/Scripts/shanuAngularScript/Controllers.js"></script>

برنامه را اجرا کنید . اولین بار نتیجه به صورت زیر است:

اگر در فیلتر نام حرفی یا کلمه ای را وارد کنید ، نتیجه را به صورت زیر مشاهده خواهید کرد:

و اگر بر روی نام ستون کلیک کنیم ، ستون مرتب شده به صورت زیر نمایش داده می شود.

آموزش angular

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید