یک نکتهی تکمیلی: روش تعریف data binding دو طرفه در کامپوننتها
در مطلب جاری، binding دو طرفه بررسی شد؛ که نکتهی مورد بحث آن، به ویژگیهای استاندارد HTML مانند ویژگی value یک input استاندارد اختصاص داشت. اما اگر بخواهیم در کامپوننتهای سفارشی خود، این binding دو طرفه را تعریف کنیم تا قابل اعمال به خواص و ویژگیهای #C باشد (مانند bind-ProprtyName@)، روش کار به نحو دیگری است. نمونهی آن کامپوننت استاندارد InputText خود Blazor است که در اینجا هم دارای bind-Value@ است؛ اما این Value (شروع شدهی با حروف بزرگ) یک خاصیت #C تعریف شدهی در کلاس InputText است و نه یک ویژگی استاندارد HTML که عموما با حروف کوچک شروع میشوند:
<InputText @bind-Value="employee.FirstName" />
الف) یک پارامتر عمومی به نام Value باید در کلاس کامپوننت جاری تعریف شود تا بتوان از طریق والد آن، مقداری را دریافت کرد (یک طرف binding به این نحو تشکیل میشود):
[Parameter] public string Value { set; get; }
[Parameter] public EventCallback<string> ValueChanged { get; set; }
نکتهی مهم: در اینجا بجای EventCallback، از Action هم میتوان استفاده کرد:
تفاوت اصلی و مهم آن با EventCallback، در فراخوانی نشدن خودکار متد StateHasChanged، در پایان کار آن است. زمانیکه EventCallback ای فراخوانی میشود، Blazor به صورت خودکار در پایان کار آن، متد StateHasChanged را نیز فراخوانی میکند تا والد دربرگیرندهی کامپوننت جاری، مجددا رندر شود (به همراه تمام کامپوننتهای فرزند آن). اما <Action<T فاقد این درخواست خودکار رندر و به روز رسانی مجدد UI است.
[Parameter] public Action<string> ValueChanged { get; set; }
ج) برای فعالسازی اعتبارسنجی استاندارد فرمهای Blazor، نیاز به خاصیت ویژهی سومی نیز هست (که اختیاری است):
[Parameter] public Expression<Func<string>> ValueExpression { get; set; }
مرحلهی آخر این طراحی، فراخوانی پارامتر ValueChanged است تا به کامپوننت والد این تغییرات را اطلاع رسانی کنیم. روش استاندارد آن به صورت زیر است:
private string _value; [Parameter] public string Value { get => _value; set { var hasChanged = string.Equals(_value, value, StringComparison.Ordinal); if (hasChanged) { _value = value; if (ValueChanged.HasDelegate) { _ = ValueChanged.InvokeAsync(value); } } } }
در این قطعه کد، بررسی ValueChanged.HasDelegate را هم مشاهده میکنید. زمانیکه پارامتر Value ای با طی سه مرحلهی فوق تعریف شد، قرار نیست حتما توسط bind-Value@ مورد استفاده قرار گیرد. میتوان Value را به صورت یک طرفه هم مورد استفاده قرار داد. در این حالت دو پارامتر ب و ج دیگر توسط Blazor ایجاد و مقدار دهی نشده و رهگیری نخواهند شد. یعنی تعریف bind-Value@ در سمت والد، معادل سیم کشی خودکار به ValueChanged و ValueExpression از طرف Blazor است و تعریف دستی آنها ضرورتی ندارد. اما میتوان bind-Value@ را هم تعریف نکرد و فقط نوشت Value. در این حالت از تنظیمات ب و ج صرفنظر میشود. بنابراین ضروری است که بررسی کنیم آیا پارامتر ValueChanged واقعا متصل به روال رویدادگردانی شدهاست یا خیر. اگر خیر، نیازی به اطلاع رسانی و فراخوانی متد ValueChanged.InvokeAsync نیست.
اشتراکها
کتابخانه jquery-sortable-lists
You can sort an items of html lists by mouse. Create tree structures. Format css of all active items however you want. You can define the isAlowed callback which determines if dragged item can be inserted into another. Set the insert zone like a distance which determines if item will be inserted inside or outside of the active area, speed of autoscroll.
Sortabl elists also contains an export functions toArray, toHierarchy, toString.
Sortabl elists also contains an export functions toArray, toHierarchy, toString.
علیرغم اینکه در Program.cs یا Startup.cs کد زیر وجود دارد، اما بازهم استثناءها در Blazor Server در قالب یک نوار زرد رنگ، پایین مرورگر نشان داده میشوند؛ حال در محیط توسعه باشد و یا در محیط تولید و پابلیش نهایی محصول!
حال کامپوننت counter را به شکل زیر ویرایش میکنیم تا استثنایی به عمد رخ دهد:
با اجرای برنامه ملاحظه خواهید کرد که به صفحهی Error.cshtml هدایت نخواهید شد! حتی با اینکه استثنایی رخ داد، خط app.UseExceptionHandler("/Error") اصلا کاری به مدیریت استثناء نداشت. حال سؤالی اینجا پیش میآید: پس چرا مایکروسافت در visual studio به تولید کدهای پیش فرض صفحه Error.cshtml و صدا زدن میان افزار فوق در یک اپلیکیشن Blazor Server میپردازد؟
if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Error"); }
برای آزمایش آن، کد فوق را به شکل زیر کامنت میکنیم تا در محیط توسعه نیز در صورتیکه استثنایی رخ داد، ما را به صفحهی Error.cshtml پیش فرض هدایت کند:
//if (env.IsDevelopment()) //{ //app.UseDeveloperExceptionPage(); //} //else //{ app.UseExceptionHandler("/Error"); //}
@page "/counter" <PageTitle>Counter</PageTitle> <h1>Counter</h1> <p role="status">Current count: @currentCount</p> <button @onclick="IncrementCount">Click me</button> @code { private int currentCount = 0; private void IncrementCount() { currentCount++; throw new Exception("This is my Exception !!"); } }
در واقع بسیاری از میان افزارهای Asp.Net Core مانند UseExceptionHandler در تمام فازهای یک اپلیکیشن Blazor Server به درستی کار نمیکنند؛ زیرا Blazor Server با SignalR و هابش کار میکند.
هنگام راهاندازی یک برنامهی Blazor Server، ابتدا چند درخواست HTTP وجود دارد که از خط لولهی Asp .Net Core عبور میکنند؛ در واقع دقیقا قبل از تشکیل هاب و عملیات websocket. در این فاز اگر استثنایی رخ دهد، آنگاه میان افزار UseExceptionHandler وارد عمل خواهد شد و صفحه را به Error.cshtml هدایت خواهد نمود و به این دلیل است که این کدها به صورت پیش فرض وجود دارند. بنابراین باید صفحهی Error.cshtml را نیز در اپلیکیشنهای تولید شدهی خود، به زبانهای موردنظر پروژهتان ترجمه کرده و پیامهای مناسبی را به کاربر نشان دهید.
باید دقت نمود که دیگر پس از این فاز نمیتوان به این میان افزار متکی بود. برای مدیریت استثناءها در فازهای بعد از این فاز، میتوان از ErrorBoundary و یا مدیریت دستی استثناءها استفاده نمود.
In this article, we’ll take a close look at some of the changes we made on this very site — running on JAMStack with React — to optimize the web performance and improve the Core Web Vitals metrics. With some of the mistakes we’ve made, and some of the unexpected changes that helped boost all the metrics across the board.
- کل Kendo UI سورس باز هست. اما مجوز عمومی استفاده از آن GPL است. یعنی باید کل کارتان را سورس باز کنید یا مجوز آنرا بخرید.
- اخیرا یک نسخهی سبکتر از Kendo UI با مجوز BSD ارائه شده که Grid آنرا ندارد (به عمد).
بنابراین از این لحاظ، مجوز jqGrid بهتر است. مجوز عمومی آن MIT است و در هر نوع پروژهای قابل استفادهاست. مجوز تجاری هم دارد برای حالتیکه بخواهید کامپوننتهای ASP.NET آنرا بخرید که ... نیازی نیست (^ و ^).
سایر مسایل خارج از بحث جاری است.
- اخیرا یک نسخهی سبکتر از Kendo UI با مجوز BSD ارائه شده که Grid آنرا ندارد (به عمد).
بنابراین از این لحاظ، مجوز jqGrid بهتر است. مجوز عمومی آن MIT است و در هر نوع پروژهای قابل استفادهاست. مجوز تجاری هم دارد برای حالتیکه بخواهید کامپوننتهای ASP.NET آنرا بخرید که ... نیازی نیست (^ و ^).
3. Can be used in proprietary works The license policy allow you to use this piece of code even inside commercial (not open source) projects. So you can use this software without giving away your own (precious?) source code.
سایر مسایل خارج از بحث جاری است.
اشتراکها
مقایسهی Blazor و Vue
If you're comfortable with JavaScript and the ecosystem, Vue is a solid framework which can easily scale up or down as your application requires.
On the other hand, if you already know and enjoy using C#, and have generally found JavaScript (the language and ecosystem) difficult to learn and live with, Blazor WASM is potentially a game changer.
اشتراکها