рдПрдЪрдЯреАрдПрдордПрд▓ 5 рдореЛрдмрд╛рдЗрд▓ рдРрдк: рдмрдЧ рдпрд╛ рд╕рдлрд▓рддрд╛ред рдкреНрд░рдпрд╛рд╕ рд╕рдВрдЦреНрдпрд╛ реж

рдХрдИ рд╕рд╛рд▓реЛрдВ рддрдХ, рд╡реЗрдм рд╡рд┐рдХрд╛рд╕ рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рд╕рдорд╛рдЪрд╛рд░ рдФрд░ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдкрдврд╝рдирд╛, рдореЗрд░рд╛ рдПрдХ рдЧреБрд▓рд╛рдмреА рд╕рдкрдирд╛ рдерд╛: рдореИрдВрдиреЗ рдПрдХ рдмрд╛рд░ рд▓рд┐рдЦрд╛ рдерд╛ - рдпрд╣ рд╣рд░ рдЬрдЧрд╣ рдФрд░ рд╣рдореЗрд╢рд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЙрд╕реА рд╕рдордп, рдореБрдЭреЗ рдЕрдХреНрд╕рд░ HTML5 рдореЗрдВ рдореЛрдмрд╛рдЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирдХрд╛рд░рд╛рддреНрдордХ рд╕рдореАрдХреНрд╖рд╛ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ ( рдпрд╣рд╛рдВ рд▓реЗрдЦ 1 рдФрд░ 2 рдкрд░ рдЯрд┐рдкреНрдкрдгреА)ред рд╕реНрдЯреНрд░рд╛рдЗрдХрд░реНрд╕ рдХреА рдореБрдЦреНрдп рджрд▓реАрд▓реЗрдВ: рджреЗрд╢реА рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрддрддрд╛, рдЪрдХрд╛рдЪреМрдВрдз рдФрд░ рдордВрджреА, рдбреЗрдЯрд╛ рд╕реНрдЯреЛрд░реЗрдЬ рдХреА рд╕рдорд╕реНрдпрд╛ рдЖрджрд┐ред рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдореИрдВ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдПрдХ рдФрд░ рд╣реЛрд▓реА рд╡рд░реНрд╕рд╛ рд▓реЙрдиреНрдЪ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ред рд▓реЗрдХрд┐рди рд╕рдкрдирд╛ рд░рд╣рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреА рдкреБрд╖реНрдЯрд┐ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ рдпрд╛ рд░реЗрдХ рдкрд░ рдЦреБрдж рдХреЗ рд╣рдорд▓реЗ рдХреЗ рдмрд╛рдж рд╣реА рдЗрд╕реЗ рдЦрд╛рд░рд┐рдЬ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рд▓рдХреНрд╖реНрдп рд╣реИ рдХрд┐ HTML5 рдореЗрдВ рдЦреБрджрд░рд╛ рджреБрдХрд╛рдиреЛрдВ рдореЗрдВ рдмрд┐рдХреНрд░реА рдПрдЬреЗрдВрдЯ рдХреЗ рд╕рд╛рде рдСрд░реНрдбрд░ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЛрдмрд╛рдЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦреЗрдВред рдореИрдВ рд╡рд┐рднрд┐рдиреНрди рдХрдВрдкрдирд┐рдпреЛрдВ рдХреЗ рдЗрди рдлреИрд╕рд▓реЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реБрдЖ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╡рд┐рд╖рдп рдХреНрд╖реЗрддреНрд░ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реВрдВ, рдФрд░ рдпрд╣ рд╡рд┐рд╖рдп рдПрдХ рд╕рдкрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ рд╣реИред

рдореБрдЦреНрдп рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рд╕реЗ рдХреБрдЫ рдиреЛрдЯреНрд╕ рдЬреЛрдбрд╝реВрдВрдЧрд╛:

рдЫреЛрдЯреЗ рдиреЛрдЯ: рдирдИ рддрдХрдиреАрдХ рдХреЗ рдЕрдзреНрдпрдпрди рдХреЗ рд▓рд┐рдП рдХрд╡рд░ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдордЬрдмреВрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗрдЦ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдиреБрднрд╡ рдХреА рдкреВрд░реА рдХрдореА рдХреЗ рдХрд╛рд░рдг, рдореИрдВ рд╕рдВрднрд╛рд╡рд┐рдд рдЦрд╛рдорд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рдорд╛рдлреА рдорд╛рдВрдЧрддрд╛ рд╣реВрдВред

рдЙрдиреНрдирдд рд╡рд╛рд╕реНрддреБрдХрд▓рд╛:

рдмреИрдХреЗрдВрдб - .net MVC рдУрдбрдЯрд╛ рдХреЗ рд╕рд╛рдеред рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░, рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕ рднреВрдорд┐рдХрд╛ рдореЗрдВ рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛, рдореБрдЦреНрдп рдмрд╛рдд рдирдП WEB рдПрдкреАрдЖрдИ рдорд╛рдирдХреЛрдВ рдХрд╛ рдЕрдиреБрдкрд╛рд▓рди рдХрд░рдирд╛ рд╣реИред рд╕реАрдорд╛ - рдореЗрд░реЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рдЬрдЯрд┐рд▓ рд╣реИред рдЕрдиреБрднрд╡ рдХреЗ рдЕрднрд╛рд╡ рдореЗрдВ, рдХреБрдЫ рдЪреБрдирдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдХреБрдЫ рдмреНрд░рд╛рдЙрдЬрд╝рд┐рдВрдЧ рдХреЗ рдмрд╛рдж, рдореИрдВ PhoneJS рдкрд░ рдмрд╕ рдЧрдпрд╛ред рдореИрдВ рдЗрд╕ рддрдереНрдп рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдерд╛ рдХрд┐ рдпрд╣ рдПрдХ рдПрд╕рдкреАрдП рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрдг рд╡рд┐рдХрд╕рд┐рдд рд░реВрдкрд░реЗрдЦрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рдВрднрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рдХрдИ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдиреЙрдХрдЖрдЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рд╣рд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рд╕реВрдЪреА рдмрджрд▓ рдЬрд╛рдПрдЧреАред рдлрд┐рд░ рдЗрд╕реЗ рд╕рднреА PhoneGap рдХреЗ рд╕рд╛рде рдкреИрдХ рдХрд░реЗрдВ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдПрдХ рд╕рд╛рджреГрд╢реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рд░рд▓ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВрдЧреЗ: рдмрд┐рдХреНрд░реА рдПрдЬреЗрдВрдЯ рдХреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рд░реНрдЧ рдкрд░ рдмрд┐рдХреНрд░реА рдХреЗ рдмрд┐рдВрджреБ рдХрд╛ рдбреЗрдЯрд╛ рджреЗрдЦрдирд╛ред

рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВред

рдПрдХ рдирдпрд╛ ASP.NET MVC 4 рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ " MSales " рдХрд╣реЗрдВ ред рдирдП ASP.NET MVC 4 рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕рдВрд╡рд╛рдж рдореЗрдВ , рд╡реЗрдм рдПрдкреАрдЖрдИ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред
рд╣рдо рдкреИрдХреЗрдЬ Update-Package knockoutjs Update-Package jQuery рд╣реИрдВ: Update-Package knockoutjs Update-Package jQuery , рдФрд░ рдЗрдВрд╕реНрдЯреЙрд▓ Install-Package Breeze.WebApi Install-Package datajs : Install-Package Breeze.WebApi Install-Package datajs ред
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, PhoneJS рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдкреИрдХреЗрдЬ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреЗрди рдХреЗ рд╕рд╛рде рд╣рдо рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рд╕реАрдПрд╕рдПрд╕ рдФрд░ рдЬреЗрдПрд╕ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд▓реЗрдЖрдЙрдЯ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ, рдореИрдВрдиреЗ _Layout.cshtml рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмрджрд▓рдХрд░ NavbarLayout рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛:
 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width" /> <title>@ViewBag.Title</title> @Styles.Render("~/Content/css") @Styles.Render("~/Content/dx") @Styles.Render("~/Content/layouts") @Scripts.Render("~/bundles/modernizr") </head> <body> @Html.Partial("NavbarLayout") @RenderBody() @Scripts.Render("~/bundles/jquery") @RenderSection("scripts", required: false) </body> </html> 

рдмрдВрдбрд▓рдХреЙрдиреНрдлрд┐рдЧ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рд╣рдо рд╕рднреА рд╕рд╛рдордЧреНрд░реА рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдореБрдЭреЗ рдпрд╣ рдЗрд╕ рддрд░рд╣ рдорд┐рд▓рд╛:
BundleConfig
 //    bundles.Add(new ScriptBundle("~/bundles/knockout").Include( "~/Scripts/knockout-{version}.js")); bundles.Add(new ScriptBundle("~/bundles/breeze").Include( "~/Scripts/q.js", "~/Scripts/datajs-{version}.js", "~/Scripts/breeze.debug.js" )); bundles.Add(new ScriptBundle("~/bundles/dx").Include( "~/Scripts/dx.phonejs.js", "~/Scripts/globalize" )); bundles.Add(new ScriptBundle("~/bundles/app").Include( "~/Scripts/App/app.init.js", "~/Scripts/App/app.viewmodel.js", "~/Scripts/App/NavbarLayout.js" )); bundles.Add(new StyleBundle("~/Content/dx").Include("~/Content/dx/dx.*")); bundles.Add(new StyleBundle("~/Content/layouts").Include("~/Content/layouts/NavbarLayout.css")); 



рдореЙрдбрд▓ рдФрд░ рдирд┐рдпрдВрддреНрд░рдХ

рдлрд┐рд▓рд╣рд╛рд▓, рд╣рдо рдореЙрдбрд▓ рдореЗрдВ рджреЛ рдлрд╛рдЗрд▓реЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВрдЧреЗ: рдорд╛рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛рдПрдВ (рдПрдХ рдмрд┐рдХреНрд░реА рдПрдЬреЗрдВрдЯ рдЗрди рдорд╛рд░реНрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдЬрд╛рддрд╛ рд╣реИ) рдФрд░ рдЖрдЙрдЯрд▓реЗрдЯ (рд╕реНрдЯреЛрд░):
рдЖрджрд░реНрд╢
 public class Route { public int RouteID { get; set; } [Required] [StringLength(30)] public string RouteName { get; set; } } public class Customer { public int CustomerID { get; set; } [Required] [StringLength(50)] public string CustomerName { get; set; } [StringLength(150)] public string Address { get; set; } public string Comment { get; set; } [ForeignKey("Route")] public int RouteID { get; set; } virtual public Route Route { get; set; } } 


рдирд┐рдпрдВрддреНрд░рдХ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реЛрдВрдЧреЗ (рдЖрдк рдпрд╣рд╛рдВ рдУрдбрдЯрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ):
рдирд┐рдпрдВрддреНрд░рдХреЛрдВ
 public class RoutesController : EntitySetController<Route, int> { private MSalesContext db = new MSalesContext(); public override IQueryable<Route> Get() { return db.Routes; ; } protected override void Dispose(bool disposing) { db.Dispose(); base.Dispose(disposing); } } public class CustomersController : EntitySetController<Customer, int> { private MSalesContext db = new MSalesContext(); public override IQueryable<Customer> Get() { return db.Customers; ; } protected override Customer GetEntityByKey(int key) { return db.Customers.FirstOrDefault(p => p.CustomerID == key); } protected override void Dispose(bool disposing) { db.Dispose(); base.Dispose(disposing); } } 



WebApiConfig рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рд╕реНрдЯреНрд░реЛрдХ:
 public static class WebApiConfig { public static void Register(HttpConfiguration config) { config.Routes.MapODataRoute("odata", "odata", GetEdmModel()); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); config.EnableQuerySupport(); config.EnableSystemDiagnosticsTracing(); } public static IEdmModel GetEdmModel() { ODataModelBuilder builder = new ODataConventionModelBuilder(); builder.EntitySet<Route>("Routes"); builder.EntitySet<Customer>("Customers"); builder.Namespace = "MSales.Models"; return builder.GetEdmModel(); } } 


рдЬрдм builder.Namespace = "MSales.Models"; рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рд░реНрдЧ рдХрд╛ рдкрдВрдЬреАрдХрд░рдг рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд▓рд╛рдЗрди builder.Namespace = "MSales.Models"; рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред builder.Namespace = "MSales.Models"; рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд╡рд╛ рдФрд░ рдбреЗрдЯрд╛рдЬ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХред

рджреГрд╢реНрдпрдкрдЯрд▓ред

рд▓рд┐рдкрд┐рдпреЛрдВ / рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓ app.init.js рдмрдирд╛рдПрдБред
 window.MyApp = {}; $(function () { MyApp.app = new DevExpress.framework.html.HtmlApplication({ namespace: MyApp, defaultLayout: "navbar", navigation: [ { title: "Routes", action: "#route", icon: "home" }, { title: "About", action: "#about", icon: "info" } ] }); MyApp.app.router.register(":view/:id", { view: "route", id: 0 }); MyApp.app.navigate(); var serverAddress = "/odata/"; breeze.config.initializeAdapterInstances({ dataService: "OData" }); MyApp.manager = new breeze.EntityManager(serverAddress); }); 

рд╣рдо рдПрдХ HTML рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рд▓реЗрдЖрдЙрдЯ рдФрд░ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рджреЛ рдмрд┐рдВрджреБ рд╣реЛрддреЗ рд╣реИрдВ: рдорд╛рд░реНрдЧ рдФрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ; рдФрд░ рд╣рд╡рд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╢реБрд░реВред
Index.cshtml рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рдЖрдкрдХреЛ "рд╕рд╛рдордЧреНрд░реА" рдирд╛рдордХ dxView рдФрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХреНрд╖реЗрддреНрд░ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдПрдХ рдирд┐рдпрдорд┐рдд рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ:
 <div data-options="dxView : { name: 'route', title: 'Routes' } " > <div class="route-view" data-options="dxContent : { targetPlaceholder: 'content' } " > <div data-bind="dxList: { dataSource: dataSource }"> <div data-options="dxTemplate : { name: 'item' }" data-bind="text: RouteName, dxAction: '#customers/{RouteID}'"/> </div> </div> </div> 

рдЗрди рджреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рд╡реНрдпреВрдореЙрдбрд▓ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд▓рд┐рдкрд┐рдпреЛрдВ / рдРрдк рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ, рдлрд╝рд╛рдЗрд▓ app.viewmodel.js рдмрдирд╛рдПрдБ :
 MyApp.route = function (params) { var viewModel = { dataSource: { load: function (loadOptions) { if (loadOptions.refresh) { var deferred = new $.Deferred(); var query = breeze.EntityQuery.from("Routes").orderBy("RouteID"); MyApp.manager.executeQuery(query, function (result) { deferred.resolve(result.results); }); return deferred; } } } } return viewModel; }; 

рдореИрдВ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ Viewmodel рдирд╛рдо dxView рдирд╛рдо рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реЛрдб рд╡рд┐рдзрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд░рд┐рдлреНрд░реЗрд╢ рдкреИрд░рд╛рдореАрдЯрд░ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рдЬреЗрдЯ рдбреЗрдЯрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдкрдбреЗрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдирд╣реАрдВред рд╡рд┐рдзрд┐ рдореЗрдВ, рд╣рдо рд░реВрдЯрдЖрдИрдбреА рдлрд╝реАрд▓реНрдб рджреНрд╡рд╛рд░рд╛ рдЫрд╛рдВрдЯ рдХрд░ рдЕрдиреБрд░реЛрдз рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдПрдХ рдФрд░ рджреГрд╢реНрдп рдЬреЛрдбрд╝реЗрдВ - рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ :
  <div data-options="dxView : { name: 'about', title: 'About' } "> <div data-options="dxContent : { targetPlaceholder: 'content' } "> <div data-bind="dxScrollView: {}"> <p style="padding: 5px">This is my first SPA application.</p> </div> </div> </div> 

IPhone рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо:
рдЫрд╡рд┐
рдЖрдкрдиреЗ рд╢рд╛рдпрдж рджреЗрдЦрд╛ рдХрд┐ dxAction: '#customers/{RouteID}' рдИрд╡реЗрдВрдЯ рдХреЛ рд╕реВрдЪреА dxAction: '#customers/{RouteID}' рдкрд░ рд▓рдЯрдХрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ dxAction: '#customers/{RouteID}' , рдЬрд╣рд╛рдВ, рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЗ рдЕрдиреБрд╕рд╛рд░, dxAction: '#customers/{RouteID}' рдХреЛ рд╡реНрдпреВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ RouteID рдЗрд╕ рджреГрд╢реНрдп рдХреЛ рджрд┐рдП рдЧрдП рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ:
 <div data-options="dxView : { name: 'customers', title: 'Customers' } " > <div data-bind="dxCommand: { title: 'Search', placeholder: 'Search...', location: 'create', icon: 'find', action: find }" ></div> <div data-options="dxContent : { targetPlaceholder: 'content' } " > <div data-bind="dxTextbox: { mode: 'search', value: searchString, visible: showSearch, valueUpdateEvent: 'search change keyup' }"></div> <div data-bind="dxList: { dataSource: dataSource }"> <div data-options="dxTemplate : { name: 'item' } " data-bind="text: name, dxAction: '#customer-details/{id}'"/> </div> </div> </div> 

рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдХрдИ рдЦрд░реАрджрд╛рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдореИрдВрдиреЗ рдЦреЛрдЬ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝реА: dxCommand - рдПрдХ рдЦреЛрдЬ рдмрдЯрди рдЬреЛ рдЦреЛрдЬ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕реВрдЪреА рдХреЗ рд╕рд╛рдордиреЗ рдПрдХ рдЗрдирдкреБрдЯ рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝рд╛ред
viewmodel:
 MyApp.customers = function (params) { var skip = 0; var PAGE_SIZE = 10; var viewModel = { routeId: params.id, searchString: ko.observable(''), showSearch: ko.observable(false), find: function () { viewModel.showSearch(!viewModel.showSearch()); viewModel.searchString(''); }, dataSource: { changed: new $.Callbacks(), load: function (loadOptions) { if (loadOptions.refresh) { skip = 0; } var deferred = new $.Deferred(); var query = breeze.EntityQuery.from("Customers") .where("CustomerName", "substringof", viewModel.searchString()) .where("RouteID", "eq", viewModel.routeId) .skip(skip) .take(PAGE_SIZE) .orderBy("CustomerID"); MyApp.manager.executeQuery(query, function (result) { skip += PAGE_SIZE; console.log(result); var mapped = $.map(result.results, function (data) { return { name: data.CustomerName, id: data.CustomerID } }); deferred.resolve(mapped); }); return deferred; } } }; ko.computed(function () { return viewModel.searchString(); }).extend({ throttle: 500 }).subscribe(function () { viewModel.dataSource.changed.fire(); }); return viewModel; }; 

рдбреЗрдЯрд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ 10 рд░рд┐рдХреЙрд░реНрдб) рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХрд┐рдк рдФрд░ PAGE_SIZE рдЪрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓реЛрдбрд┐рдВрдЧ рд╣реЛрдЧреАред
рдЪрд░ рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдЦреЛрдЬ, рдЬрд┐рд╕ рдкрд░ рдЦреЛрдЬ рдПрдХ рдЪрд░рд┐рддреНрд░ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдПрдХ рдЖрдзреЗ рд╕реЗрдХрдВрдб рдХреА рджреЗрд░реА рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред
рдкрд░рд┐рдгрд╛рдо:
рдЫрд╡рд┐
рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЪрдпрдирд┐рдд рдЦрд░реАрджрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ:
рджреЗрдЦреЗрдВ:
 <div data-options="dxView : { name: 'customer-details', title: 'Product' } " > <div data-options="dxContent : { targetPlaceholder: 'content' } " > <div class="dx-fieldset"> <div class="dx-field"> <div class="dx-field-label">Id: </div> <div class="dx-field-value" data-bind="text: id"></div> </div> <div class="dx-field"> <div class="dx-field-label">Name: </div> <div class="dx-field-value" data-bind="text: name"></div> </div> <div class="dx-field"> <div class="dx-field-label">Address: </div> <div class="dx-field-value" data-bind="text: address"></div> </div> <div class="dx-field"> <div class="dx-field-label">Comment: </div> <div class="dx-field-value" data-bind="text: comment"></div> </div> </div> </div> </div> 

ViewModel:
 MyApp['customer-details'] = function (params) { var viewModel = { id: parseInt(params.id), name: ko.observable(''), address: ko.observable(''), comment:ko.observable('') }; var data = MyApp.manager.getEntityByKey("Customer", viewModel.id); console.log(data); viewModel.name(data.CustomerName()); viewModel.address(data.Address()); viewModel.comment(data.Comment()); return viewModel; }; 

рдЫрд╡рд┐
рдиреЛрдЯ: рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рд░рд┐рдкрд▓ рдПрдореБрд▓реЗрдЯрд░ (рдмреАрдЯрд╛) рдПрдореБрд▓реЗрдЯрд░ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рд╕рд╛рд░рд╛рдВрд╢ред

рд╣рдореЗрдВ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдФрд░ рдбреЗрдЯрд╛ рд▓реЛрдбрд┐рдВрдЧ рд╡рд╛рд▓реЗ рдореЛрдмрд╛рдЗрд▓ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд┐рд▓реНрдХреБрд▓ рд╕рд░рд▓ рдкреВрд░реНрдг-рдкреВрд░реНрдг SPA рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдорд┐рд▓рд╛ред рдлрд┐рд▓рд╣рд╛рд▓, рдЧреБрдгрд╡рддреНрддрд╛ / рдЧрддрд┐ / рдЖрджрд┐ рдХрд╛ рдиреНрдпрд╛рдп рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдЕрдиреБрдкреНрд░рдпреЛрдЧ, рдЗрд╕рд▓рд┐рдП рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдереЛрдбрд╝рд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реВрдВрдЧрд╛ рдФрд░ рдПрдЬрд╝реНрдпреЛрд░ рдкрд░ рд▓реЗрдЯ рдЬрд╛рдКрдВрдЧрд╛, рддрд╛рдХрд┐ рд╣рд░ рдХреЛрдИ рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХреЗред

Source: https://habr.com/ru/post/In185316/


All Articles