- PVSM.RU - https://www.pvsm.ru -
disclaimer: сравнение не подразумевает поднятие “холивара”, а делает обзор задач, решаемых одним инструментом в сравнении с другим. Я не являюсь знатоком всех тонкостей angularJs, но прочитав 10 статьей обзора этого инструмента, привожу альтернативный пример решения тех же самых задач на IML.
Я выбрал те возможности, которые имеют смысл, потому что в рамках asp.net mvc пользу в перемененных, константах, а также в поддержке локализации не вижу.
примечание: далее часто будет учитываться то, что разработка проходит в рамках asp.net mvc
Методика очень простая, привожу листинг AngularJS ( View и Js ) и IML ( только View ) варианта, далее аргументирую чем же IML лучше. Я буду выделять только плюсы, но буду рад увидеть и отрицательные стороны IML в комментариях, поэтому все свои замечания можно высказать.
<div ng-controller="angularController">
<button ng-click="sayHello()">Say</button>
</div>
app.controller('angualrController', function ($scope) {
$scope.sayHello = function(){
alert('Hello')
}
});
@(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
<div ng-conroller="productController">
@Html.TextBoxFor(r => r.Code)
<label>{{model.Name}}</label>
<button>Get name</button>
</div>
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
});
}
});
@{ 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, можно использовать в качестве Routes не только анонимный объект, но и типизированный вариант Url.Action(“Product”,”Get”,new GetProductQuery() { Code = Html.Selector().Name(r=>r.Code) })
В Incoding Framework можно обойтись без написания дополнительных Controller и Action если в качестве url применить MVD
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>
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') });
});
@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"))
Url.Disaptcher().Push( new {
Name = Html.Selector().Name(r=>r.Name),
IsGood = Html.Selector().Name(r=>r.IsGood)
})
<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>
controller('productController', function ($scope, $http) {
$scope.submit = function(){
$http({
url: 'product/Add',
method: "POST",
data: angular.toJson($scope.addForm)
}).success(function(data) { alert('success') });
});
@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>
app.controller('personController', function ($scope,$http) {
$scope.refresh= function(){
$http.get('person/fetch', function(data){
$scope.Persons= data
});
}
});
@{
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) }
}
}
@(Html.When(JqueryBind.InitIncoding)
.Do()
.AjaxGet(Url.Action("Personal","Fetch"))
.OnSuccess(dsl => dsl.Self().Core().Insert.WithTemplate(tmplId.ToId()).Html())
.AsHtmlAttributes()
.ToDiv())
myApp.run(function($templateCache) {
$templateCache.put('templateId.html', 'This is the content of the template');
});
Вывод: AngularJs разворачивает mvc архитектуру на клиенте, что с одной стороны позволяет структурировать код, но так же добавляет дополнительные проблемы в поддержке. Разработчик asp.net mvc имеет серверную реализацию mvc, где применяя более мощные и подходящие языки, можно избежать усложнения.
Автор: vkopachinsky
Источник [1]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/56173
Ссылки в тексте:
[1] Источник: http://habrahabr.ru/post/214293/
Нажмите здесь для печати.