AngularJSとIML

画像



免責事項 :比較は「ホリバー」を上げることを意味するのではなく、あるツールが別のツールと比較して解決するタスクの概要を示します。 私は、angularJのすべての複雑さに精通しているわけではありませんが、このツールに関する10の記事を読んだ後、IMLで同じ問題を解決する別の例を示します。





何を比較しますか?







asp.net mvcのフレームワーク内では、変数、定数、およびローカリゼーションサポートには利点がないため、意味のある機能を選択しました。

注:以下では、asp.net mvcのフレームワーク内で開発が行われることがしばしば考慮されます。



どのように比較しますか?



この手法は非常に単純です。AngularJS(ViewおよびJs)およびIML(Viewのみ)オプションを引用し、さらにIMLの方が優れている理由を説明します。 私は長所だけを強調しますが、コメントでIMLのマイナス面を見て喜んでいるので、すべてのコメントを作成できます。



コントローラー


角度JSビュー


<div ng-controller="angularController"> <button ng-click="sayHello()">Say</button> </div>
      
      





角度js


 app.controller('angualrController', function ($scope) { $scope.sayHello = function(){ alert('Hello') } });
      
      





IML


 @(Html.When(JqueryBind.Click) .Do() .Direct() .OnSuccess(dsl => dsl.Utilities.Window.Alert("Hello")) .AsHtmlAttributes() .ToButton("Say"))
      
      







より良い:






サーバーへのアクセス


サーバーコード


 public ActionResult Get(GetProductByCodeQuery query) { List vms = dispatcher.Query(query); return IncJson(vms); // for AngularJs need use Json with AllowGet }
      
      





注:サーバー側は、AngularJSとIMLの両方で同じです

角度html


 <div ng-conroller="productController"> @Html.TextBoxFor(r => r.Code) <label>{{model.Name}}</label> <button>Get name</button> </div>
      
      





角度js


 kitchen.controller('productController', function ($scope, $http) { $scope.get = function(){ $http.get({ url:'product/get', params:{Code:$('[Name="Code"]').val()} }) .success(function(data) { $scope.Name = data.Name }); } });
      
      





IML


 @{ var labelId = Guid.NewGuid().ToString(); } @Html.TextBoxFor(r=>r.Code) @(Html.When(JqueryBind.Click) .Do() .AjaxGet(Url.Action("Product","Get",new { Code = Html.Selector().Name(r=>r.Code) }) .OnSuccess(dsl => dsl.WithId(labelId).Core().Insert.For(r=>r.Name).Text()) .AsHtmlAttributes() .ToButton("Get name"))
      
      





注:URLを構築するとき、ルートとして匿名オブジェクトだけでなく、Url.Actionの型付きバージョン(「Product」、「Get」、new GetProductQuery(){Code = Html.Selector()。Name(r => r.Code)})



より良い:




Incoding Frameworkでは、MVDをURLとして使用すると、追加のコントローラーとアクションを記述せずに実行できます

 Url.Dispatcher().Query(new GetProductQuery() {Code = Html.Selector().Name(r=>r.Code)}).AsJson()
      
      







プッシュデータ


サーバーコード


 public ActionResult Add(AddCommand input) { dispatcher.Push(input); return IncJson(); // for AngularJS need use Json() }
      
      





注:サーバー側は、AngularJSとIMLの両方で同じです



角度表示


 <div ng-controller="productController"> @Html.TextBoxFor(r => r.Name) @Html.CheckboxFor(r => r.IsGood) <button ng-click="add"> Add </button> </div>
      
      





角度js


 kitchen.controller('productController', function ($scope, $http) { $scope.add = function(){ $http({ url: 'product/Add', method: "POST", data: { Name : $('[name="Name"]').val(), IsGood : $('name="IsGood"]').is(':checked') } }) .success(function(data) { alert('success') }); });
      
      





IML


 @Html.TextBoxFor(r=>r.Name) @Html.CheckboxFor(r=>r.IsGood) @(Html.When(JqueryBind.Click) .Do() .AjaxPost(Url.Action("Product","Add",new { Name = Html.Selector().Name(r=>r.Name), IsGood = Html.Selector().Name(r=>r.IsGood) })) .OnSuccess(dsl => dsl.Utilities.Window.Alert("Success")) .AsHtmlAttributes() .ToButton("Add"))
      
      







より良い:






フォームを送信


角度表示


 <div ng-controller="productController"> <form name="AddForm"> @Html.TextBoxFor(r => r.Name) @Html.CheckboxFor(r => r.IsGood) <input type="submit" value="save" ng-submit="submit" /> </form> </div>
      
      





角度js


 controller('productController', function ($scope, $http) { $scope.submit = function(){ $http({ url: 'product/Add', method: "POST", data: angular.toJson($scope.addForm) }).success(function(data) { alert('success') }); });
      
      





IML


 @using(Html.When(JqueryBind.Submit) .DoWithPreventDefault() .Submit() .OnSuccess(dsl => dsl.Utilities.Window.Alert("Success")) .AsHtmlAttributes() .ToBeginForm(Url.Action("Product","Add"))) { @Html.TextBoxFor(r=>r.Name) @Html.CheckboxFor(r=>r.IsGood) <input type="submit" value="add"> }
      
      





より良い:




テンプレート



サーバーコード


 public ActionResult Fetch() { var vms = new List() { new PersonVm(){ Last= "Vasy", First = "Smith", Middle = "Junior"}, new PersonVm(){ Last= "Vlad", First = "Smith", Middle = "Mr"}, }; return IncJson(vms); // for angular need use Json with AllowGet }
      
      





注:サーバー側は、AngularJSとIMLの両方で同じです

角度テンプレート


 <script id="person.html" type="text/ng-template"> {{person.last}}, {{person.first}} {{person.middle}} </script>
      
      





角度表示


 <div ng-controller="productAddForm"> <div ng-repear="person in persons" ng-template="person.html"> </div> </div>
      
      





角度js


 app.controller('personController', function ($scope,$http) { $scope.refresh= function(){ $http.get('person/fetch', function(data){ $scope.Persons= data }); } });
      
      





IMLテンプレート


 @{ var tmplId = Guid.NewGuid().ToString(); using (var template = Html.Incoding().Template(tmplId)) { using (var each = template.ForEach()) { @each.For(r=>r.First),@each.For(r=>r.Middle),@each.For(r=>r.Last) } } }
      
      





IMLビュー


 @(Html.When(JqueryBind.InitIncoding) .Do() .AjaxGet(Url.Action("Personal","Fetch")) .OnSuccess(dsl => dsl.Self().Core().Insert.WithTemplate(tmplId.ToId()).Html()) .AsHtmlAttributes() .ToDiv())
      
      





より良い:








一般的な利点は何ですか:






結論 :AngularJsはmvcアーキテクチャをクライアントにデプロイします。これにより、一方でコードを構造化できますが、サポートの問題も追加されます。 開発者asp.net mvcにはmvcのサーバー側の実装があり、より強力で適切な言語を使用して、複雑さを回避できます。



All Articles