Porting existing code to .NET Core used to be quite hard because the available API set was very small. In .NET Core 2.0, we already made this much easier, thanks to .NET Standard 2.0. Today, we’re happy to announce that we made it even easier with the Windows Compatibility Pack, which provides access to an additional 20,000 APIs via a single NuGet package.
کتابخانه angular-checkboxes
If you are used to manipulate HTML forms, you probably know that each checkbox is a separate variable (or maybe an ngModel with AngularJS). Demo
Sometimes, it could be usefull to manipulate all these checkboxes as a unique array.
angular.checkboxes
module lets you turn your list of checkboxes into a unique destination array, providing :
- two-way binding: manipulate the destination array will check/uncheck the checkboxes AND check/uncheck the checkboxes will modify the destination array.
- no isolated scope for each checkbox: the directive does not create new child scope.
- a mtCheckboxController: internal controller can be injected to other directives.
همچنین نگارش نهایی آن هم به زودی در دسترس خواهد بود.
+ زمانیکه قرار است از فریم ورکهای جاوا اسکریپتی SPA یا Single page applications مانند AngularJS استفاده شود، عملا دات نت تبدیل خواهد شد به فراهم کنندهی اطلاعات و دریافت کنندهی اطلاعات و نه بیشتر. بنابراین حداکثر به یک وب سرور نیاز خواهد بود؛ به همراه فناوری که بتواند JSON تولید کند (ارسال data به کلاینت) و JSON دریافت کند (دریافت data از کاربر). در این حالت اهمیتی ندارد که از MVC استفاده کنید یا از ASP.NET Web API و یا ... هر فناوری سمت سرور دیگری. همینقدر که این فناوری بتواند خروجی JSON را پردازش کند و یا در کنار آن وب سروری هم جهت هاست سایت فراهم باشد، کافی است.
یعنی در این حالت قابلیتهای رندر HTML فناوریهایی مانند ASP.NET MVC و هم ASP.NET Web forms فراموش خواهند شد؛ چون استفادهای از توانمندیهای آنها نخواهیم کرد.
استفاده از فریم ورکهای SPA یعنی آزادی انتخاب نحوهی ندر HTML نهایی و مدیریت فعالیتهای کاربران در سمت کاربر. سمت سرور آن هم چیزی بیشتر از دریافت و یا ارسال data با فرمت JSON نیست.
UserDialogs.Init(this); // Before Forms.Init
containerBuilder.RegisterInstance(UserDialogs.Instance);
public IUserDialogs UserDialogs { get; set; } public async Task Login() { if (string.IsNullOrWhiteSpace(UserName) || string.IsNullOrWhiteSpace(Password)) await UserDialogs.AlertAsync(message: "Please provide UserName and Password!", title: ")-:", okText: "Ok!"); }
using (UserDialogs.Loading("Logging in...", maskType: MaskType.Black)) { // Login implementation ... await Task.Delay(TimeSpan.FromSeconds(3)); }
await NavigationService.NavigateAsync("/Login", animated: false);
await NavigationService.NavigateAsync("/Nav/HelloWorld");
3- ممکن است بخواهید هنگام رفتن از صفحهای به صفحه دیگر، پارامتر نیز ارسال کنید. اگر برای مثال صفحه اول لیست محصولات را نمایش میدهد و با زدن روی هر محصول قرار است به صفحهای برویم که جزئیات آن محصول را ببینیم، بهتر است Id آن محصول به صورت پارامتر به صفحه دوم ارسال شود. برای این کار داریم:
await NavigationService.NavigateAsync("ProductDetail", new NavigationParameters { { "productId", productId } });
حال سؤال این است که در صفحه جزئیات یک محصول، چگونه productId را بگیریم؟ فرض کنید دو صفحه ProductsList و ProductDetail را داریم. هر صفحه دارای View و View Model است. در ViewModel مربوط به ProductDetail، یعنی ProductDetailViewModel که از BitViewModelBase ارث بری کردهاست، میتوانیم متد OnNavigatedToAsync را override کنیم. در آنجا به پارامترهای ارسال شده دسترسی داریم:
public async override Task OnNavigatedToAsync(INavigationParameters parameters) { await base.OnNavigatedToAsync(parameters); Guid productId = parameters.GetValue<Guid>("productId"); }
هر ViewModel علاوه بر OnNavigatedTo می تواند دارای OnNavigatedFrom هم باشد که زمانیکه داریم از صفحه مربوطه خارج میشویم، فراخوانی میشود.
4- برای نمایش صفحه به صورت Popup کافی است بجای اینکه View ما یک Content Page باشد، یک PopupPage باشد (برای درک بهتر، فایل IntroView.xaml را در فولدر Views باز کنید).
حتی میتوانید Animation مربوط به باز شدن پاپ آپ را هم کاملا Customize کنید. مثلا زمان باز شدن، از سمت راست صفحه وارد شود و زمان خارج شدن، Fade out شود. باز کردن Popup در Navigation Page معنی نمیدهد، پس با Nav/ در اینجا کاری نداریم. در مثال ما، بعد از لاگین میخواهیم یک صفحه Intro شامل هشدارها و راهنماییهای اولیه را در قالب Popup به کاربر نمایش دهیم. Popupها میتوانند همچون Content Pageها، دارای View Model باشند و مواردی چون OnNavigatedTo، ارسال پارامتر و هر آنچه که گفته شد، در مورد آنها نیز صدق میکند.
5- برای Master/Detail کافی است بجای Nav/HelloWorld/ از MasterDetail/Nav/HelloWorld/ استفاده کنید. این عمل باعث میشود HelloWorld در داخل Navigation Page و Navigation Page داخل Master Detail باز شود. از این سادهتر امکان ندارد!
برای تغییر UI مربوط به Master که از سمت چپ باز میشود، فایل XamAppMasterDetailView.xaml را تغییر دهید.
در قسمت بعدی به جزئیات Binding خواهیم پرداخت.
سری آموزشی Angular Material
Angular CLI - قسمت اول - نصب و راه اندازی
به همراه Angular CLI نگارش 1.7، دستور جدیدی به نام ng update اضافه شدهاست که تمام وابستگیهای مرتبط به Angular را به صورت خودکار به روز رسانی میکند.
سری بررسی مقدمات Blazor
Blazor Fundamentals Tutorial
Blazor server-side vs client-side (WebAssembly) | What should you choose?
What are Razor Components? | Blazor Tutorial 1
Dependency Injection | Blazor Tutorial 2
What are Blazor Layouts? | Blazor Tutorial 3
Routing and Navigation | Blazor Tutorial 4
JS Interop: Calling JavaScript from C# | Blazor Tutorial 5
JS Interop: Calling C# methods from JavaScript | Blazor Tutorial 6
Creating Forms with Validation | Blazor Tutorial 7
How to add Authentication in Server-side Blazor | Blazor Tutorial 8
Authorization in Server-Side Blazor | Blazor Tutorial 9
How to use HTML5 Web Storage in Blazor | Blazor Tutorial 10
Managing Blazor state using Redux | Blazor Tutorial 11
Creating a desktop application using Blazor and Electron | Blazor Tutorial 12
Deploying Server-Side Blazor in Azure with SignalR service | Blazor Tutorial 13
Building cross platform mobile apps with Blazor (Experimental)
inject$ در AngularJs
ابتدا مثال زیر را به روشهای قبلی پیاده سازی میکنیم:
var app = angular.module('myApp', []); app.factory('bookService', function () { var books = [ { name: 'A' }, { name: 'B' }, { name: 'C' } ]; return books; }); app.controller('bookCtrl', function ($scope, bookService) { $scope.books = bookService; })
<script type="text/javascript" src="~/scripts/Modules/module5.js"></script> <div ng-app="myApp"> <div ng-controller="bookCtrl"> <table> <tr ng-repeat="book in books"> <td> {{book.name}} </td> </tr> </table> </div> </div>
var bookCtrl = function (sc,bs) { sc.books = bs; };
app.controller('bookCtrl',bookCtrl);
bookCtrl.$inject = ['$scope','bookService'];
var app = angular.module('myApp', []); app.factory('bookService', function () { var books = [ { name: 'A' }, { name: 'B' }, { name: 'C' } ]; return books; }); var bookCtrl = function (sc,bs) { sc.books = bs; }; bookCtrl.$inject = ['$scope','bookService']; app.controller('bookCtrl',bookCtrl);
از این پس در هنگام فراخوانی تابع کنترلر bookCtrl سرویسهای scope$ و bookService به ترتیب به عنوان آرگومانهای اول و دوم در اختیار کنترلر قرار میگیرند. میتوان به جای فراخوانی مستقیم inject$، تزریق وابستگیها را در هنگام تعریف توابع سازنده به صورت زیر نیز فراهم ساخت:
app.controller('bookCtrl', ['$scope', 'bookService', function (sc, bs) { sc.books = bs; }])
Bootstrap 4 در واقع یک اقدام بزرگ بود که پس از یک سال توسعه، بزرگی این اقدام در خط به خط کدها احساس میگردد. تصمیم گرفتیم تا نسخهی اولیهی آن را به اشتراک بگذاریم و انتقادات و پیشنهادات شما را بشنویم. برای بهبود و پیشرفت در این زمینه، بسیاری از اخبار مرتبط را در اختیار شما قرار میدهیم. امیدواریم که ما را در بهتر شدن یاری کنید.
امکانات جدید Bootstrap
انتقال از Less به Sass
بهبود grid system مبتنی بر "rems"
h1 { /* 16 * 2.5 = 40px */ }