Come learn the top 7 reasons to use Visual Studio 2017 if you are a C++ developer. Whether you are using the product and are looking to upgrade, or you never used it before but you are considering it now, join us to discover how Visual Studio 2017 raises the bar in terms of C++ productivity. From C++ standards conformance to coding productivity, cross-platform development for Windows, Linux, Android, and iOS and CMake support, these are only a few of the topics we discuss in this demo-packed session.
نظرات مطالب
AngularJS #2
سلام
بنده طبق فرمایشات شما به روش زیر عمل کردم ولی بهم کار نمیده و پارشال مورد نظر را به من نشان نمیده. میشه بگید مشکل از کجاست؟
و کدهای ویو:
و کدهایی که در فایل _Layout.cshtml نوشته ام:
بنده طبق فرمایشات شما به روش زیر عمل کردم ولی بهم کار نمیده و پارشال مورد نظر را به من نشان نمیده. میشه بگید مشکل از کجاست؟
public class PostController : Controller { ApplicationDbContext db; // GET: Post public ActionResult List() { using (db=new ApplicationDbContext()) { var query = db.Posts.ToList(); return PartialView("List",query); } } }
و کدهای ویو:
<div ng-app="postmodule"> <div ng-controller="PostController"> <ul> <li ng-repeat="item in ListOfItems"> {{item.Title}} <hr /> {{item.Text}} </li> </ul> </div> </div>
و کدهایی که در فایل _Layout.cshtml نوشته ام:
<div class="container body-content" > <script src="~/Scripts/angular.js"></script> <script src="~/Scripts/angular-route.js"></script> <script> var PostApp = angular.module('postmodule', []).config(['$routeProvider', function ($routeProvider) { $routeProvider. when('/list', { templateUrl: '/Post/List', controller: 'PostController' }); }]); PostApp.controller('PostController', function ($scope, $http, postServices) { //... $scope.ListOfItems = postServices.GetPosts() .success(function (data) { $scope.ListOfItems = data; }); //... }); PostApp.service('postServices', function ($http) { this.GetPosts = function () { return $http.get('/Post/List'); }; }); </script> <a href="#list">list post</a> <div ng-view=""></div> @RenderBody() <hr /> <footer> <p>© @DateTime.Now.Year - My ASP.NET Application</p> </footer> </div>
اشتراکها
کتابخانه sammy
اشتراکها
نگاهی بر Tuples در سیشارپ 7
اشتراکها
کتابخانه ToProgress
A lightweight (2.2 KB), no-dependency top progress bar library. Demo
یک نکتهی تکمیلی: کاربرد base href در فایل index.html چیست؟
فرض کنید برنامهی شما قرار است از داخل زیر پوشهی جدید blazor با آدرس http://example.com/blazor ارائه شود. در این حالت پس از مراجعه به این آدرس، فقط loading را مشاهده خواهید کرد و ... برنامه بارگذاری نمیشود. علت اینجا است که در حالت پیشفرض، base href تنظیم شدهی در فایل index.html، به ریشهی سایت اشاره میکند:
بنابراین در این حالت برنامه فایلهای مورد نیاز خود را در ریشهی وب سرور جستجو خواهد کرد و نه از زیر پوشهی blazor. برای رفع این مشکل باید تغییر زیر صورت گیرد:
فرض کنید برنامهی شما قرار است از داخل زیر پوشهی جدید blazor با آدرس http://example.com/blazor ارائه شود. در این حالت پس از مراجعه به این آدرس، فقط loading را مشاهده خواهید کرد و ... برنامه بارگذاری نمیشود. علت اینجا است که در حالت پیشفرض، base href تنظیم شدهی در فایل index.html، به ریشهی سایت اشاره میکند:
<!DOCTYPE html> <html> <head> <base href="/" />
<base href="/blazor/" />
اشتراکها
آشنایی با دستور APPLY در SQL Server
The APPLY operator allows you to invoke a table-valued function for each row returned by an outer table expression of a query
در قسمتهای قبلی (^ ,^ ,^ ) نحوهی ارتباط بین کامپوننتها بررسی شد؛ روش دیگری هم برای به اشتراک گذاری دادهها بین کامپوننتها وجود دارد که با استفاده از کتابخانهای بنام Vuex پیاده سازی میشود. وقتی برنامهی شما وسعت پیدا میکند و ارتباط بین کامپوننتها بیشتر و پیچیدهتر میشود، روشهای قبلی (^ ,^ ,^ ) کارایی لازم را ندارند و یا اینکه به سختی میشود دادههای به اشتراک گذاشته شدهی بین کامپوننتها را مدیریت نمود. در اینجا میتوان از Vuex استفاده کرد و بهراحتی ارتباطهای پیچیدهی بین کامپوننتها را مدیریت کرد.
درون کامپوننت اصلی برنامه App.vue، هر دو کامپوننت را فراخوانی میکنیم:
در Terminal دستور زیر را تایپ و اجرا کنید تا نتیجه رویت گردد:
در این برنامه از دو کامپوننت مجزا با دادهی واحد، استفاده میکنیم و دیگر خبری از emit$ و on$ و EventBus و تزریق وابستگی نخواهد بود.
سپس برنامه را با دستور زیر اجرا کنید:
کد زیر را در نظر بگیرید:
new Vue({ // state // دادهها در اینجا قرار میگیرند data () { return { count: 0 } }, // view // ویوها برای نمایش دادهها مورد استفاده قرار میگیرند template: `<div>{{ count }}</div>`, // actions // برای تغییر دادهها از متدها استفاده میکنیم methods: { increment () { this.count++ } } })
در یک کامپوننت ساده، از طریق Actionها، دادهها (State) تغییر داده میشوند و سپس این تغییر در view مشاهده میشود. اما فرض کنید بیش از صد کامپوننت در برنامه دارید که بسیاری از آنها از دادههای واحدی استفاده میکنند. روشهای قبلی (^ ,^ ,^) برای چنین سناریویی جوابگو نخواهند بود (آنرا به سختی میتوان مدیریت کرد و بسیار طاقت فرسا خواهد بود).
راه حل Vuex:
با استفاده از Vuex میتوان برای دادهها (State)، یک منبع در نظر گرفت تا کامپوننتها قادر باشند از دادههای واحدی استفاده کنند و اشتراک گذاری دادهها ساده شود.
یک برنامه ساده با استفاده از Vuex:
یک پروژه Vuejs را ایجاد کنید و مطابق تصویر زیر، گزینه دوم را انتخاب و Enter را فشار دهید:
سپس گزینه Vuex را طبق تصویر زیر با دکمهی space انتخاب کنید و برای مابقی گزینههای بعدی با زدن Enter، پیش فرضها را بپذیرید تا پروژه ساخته شود:
دو کامپوننت را به برنامه اضافه میکنیم.
کامپوننت اول با نام increase-counter-component.vue
<template> <div> <!-- نمایش شمارشگر --> <h1>{{count}}</h1> <!-- افزودن یک واحد به شمارشگر --> <button @click="add">Add 1</button> <!-- افزودن مقداری دلخواه به شمارشگر --> <button @click="add2">Add 2</button> </div> </template> <script> // یا همان منبع ذخیره دادهها store کردن import import store from "../store"; export default { // You can consider computed properties another view into your data. // https://css-tricks.com/methods-computed-and-watchers-in-vue-js/ computed: { count: () => store.state.count }, // به دو طریق فراخوانی شده add تابع methods: { // بدون پارامتر add: () => store.commit("add"), // با پارامتر // برای مقدار مورد نظر استفاده کنیم input میتوانیم بجای مقدار ثابت از یک add2: () => store.commit("add", 2) } }; </script>
کامپوننت دوم با نام decrease-counter-component.vue
<template> <div> <h1>{{count}}</h1> <button @click="subtract">Subtract 1</button> <button @click="subtract(3)">Subtract 3</button> </div> </template> <script> import store from "../store"; export default { computed: { count: () => store.state.count }, methods: { subtract: payload => store.commit("subtract", +payload) } }; </script>
<template> <div id="app"> <img alt="Vue logo" src="./assets/logo.png" /> <counter-plus></counter-plus> <hr /> <hr /> <counter-minus></counter-minus> </div> </template> <script> import counterPlus from "./components/increase-counter-component"; import counterMinus from "./components/decrease-counter-component"; export default { name: "app", components: { "counter-plus": counterPlus, "counter-minus": counterMinus } }; </script>
محتویات فایل store.js که تنظیمات Vuex در آن لحاظ شدهاست به شکل زیر میباشد:
import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) export default new Vuex.Store({ // دادههای به اشتراک گذاشته شده state: { count: 0 }, // تعریف متدها mutations: { add(state, payload) { // If we get a payload, add it to count // Else, just add one to count payload ? (state.count += payload) : state.count++; }, subtract(state, payload) { payload ? (state.count -= payload) : state.count--; } } });
npm run serve
چگونه کار میکند؟
در Vuex، متدها در قسمت mutation در فایل store.js نوشته میشوند و در methods درون کامپوننتها فراخوانی میشوند. اگر با سی شارپ آشنا باشید، این فراخوانی تقریبا شبیه delegate میباشد. دادهها در store.js تعریف میشوند و در سراسر برنامه در تمام کامپوننتها قابل دسترس میباشند. بدین ترتیب اشتراک گذاری دادهها بین کامپوننتها بسیار ساده میباشد.
npm install
npm run serve