Jak przekazać dane z kontrolera serwera do kontrolera AngularJS?


Natknąłem się na to, co uważam za typowy scenariusz, w którym używam wzorca MVC (konkretnie platformy MVC ASP.NET) dla aplikacji internetowej z AngularJS w interfejsie. Mój problem polega na tym, że mam określoną wartość, która jest częścią modelu przekazywanego do mojego widoku, którą również chcę udostępnić w zakresie $ scope mojego kontrolera Angular, najlepiej, gdy tylko kontroler zostanie zainicjowany.
Jak to zrobić, to pytanie, które zostało już zadane i na które udzielono odpowiedzi. Jest na to oczywisty kandydat:
ngInit
. Jednak w pewnym momencie Angular został zaktualizowany

swoją dokumentację
http://docs.angularjs.org/api/ng/directive/ngInit/
w czymś, co wydaje się być ostrzeżeniem przed tą konkretną myślą:

Jedynym odpowiednim zastosowaniem
ngInit
jest wygładzanie specjalnych właściwości
ngRepeat
, jak pokazano na poniższej demonstracji. Również w tym przypadku kontrolery powinny być używane do inicjalizacji wartości w zakresie, a nie
ngInit
.

Proponowana alternatywa nie jest zbyt odpowiednia.
Oczywiście mogę wymyślić inne obejścia. Na przykład widok może wstawić wartość do dyrektywy
ngModel
dla ukrytych danych wejściowych. Albo mógłbym po prostu zignorować ostrzeżenie i mimo wszystko użyć
ngInit
. Ale wszystko, co przychodzi mi do głowy, to albo brzydszy sposób na zrobienie tego samego, co
ngInit
, albo wyraźnie gorszy.
Ostatecznie fakt, że to, co wydaje mi się oczywistym rozwiązaniem, jest ewidentnie błędne, jest prawdopodobnie wskazówką, że moje myślenie nie jest zgodne z tym, jak powinno się robić Angular. Więc moje pytanie nie brzmi „jak sobie z tym poradzić”, ale raczej:
  • Jak ja rozdać z tym scenariuszem czy go uniknąć
  • Dlaczego nie powinienem używać
    ngInit

Wyjaśnienie, ponieważ nie wynika to jasno z pierwszych dwóch komentarzy: Dotyczy to sytuacji, w której część lub większość strony jest obsługiwana bezpośrednio jako widok MVC, a Angular zapewnia tylko określoną część funkcjonalności. Dane, które chcę przekazać do mojego kontrolera Angular, są już przekazane do widoku w modelu. Nie chcę, aby kontroler Angular przeszedł i musiał wykonać własne żądanie get do serwera, aby uzyskać ten sam parametr, który jest już dostępny do prezentacji w innym formacie.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Musisz przekazać go z kontrolera serwera do kontrolera AngularJS przy użyciu dostawcy „value” lub „constant”, jak opisano poniżej:

https://docs.angularjs.org/guide/providers
https://docs.angularjs.org/guide/providers
Na przykład możesz zrobić coś takiego:
<script>
angular.module("hobbitModule").value("companionship", @Html.Raw(Model));
</script>

a następnie wstrzyknij go do kontrolera
var module = angular.module("hobbitModule");
module.controller("CompanionshipController", function($scope, companionship) {
$scope.companions = companionship;
});

jak opisano w tym artykule:

http://blog.mariusschulz.com/2 ... t-mvc
http://blog.mariusschulz.com/2 ... t-mvc
Jeśli uważasz, że może to być bardziej złożone niż tylko wartość, możesz użyć usługodawcy i wprowadzić go zamiast dostawcy wartości.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

powiedzmy, że masz ten model:


Model

public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public float Price { get; set; }
public string Description { get; set; }
}

w ten sposób możesz przekazać dane od swojego kontrolera do swojego widoku:


Kontroler

public string GetSerializedProduct()
{
var products = new[]
{
new Product{Id=1,Name="product1",Price=4500,Description="description of this product"},
new Product{Id=2,Name="product2",Price=500,Description="description of this product"},
new Product{Id=3,Name="product3",Price=400,Description="description of this product"},
new Product{Id=4,Name="product4",Price=5500,Description="description of this product"},
new Product{Id=5,Name="product5",Price=66500,Description="description of this product"}
};
var settings = new JsonSerializerSettings { ContractResolver=new CamelCasePropertyNamesContractResolver()};
return JsonConvert.SerializeObject(products,Formatting.None,settings);
}
}


Zegarek

:
@model string
<div class="container" ng-init="products = @Model">
<div class="row">
<div class="col-lg-12">
<table class="table table-condensed table-hover">
<tr>
<th>Id</th>
<th>Product Name</th>
<th>Price</th>
<th>Description</th>
</tr>
<tr ng-repeat="product in products">
<td>{{product.id}}</td>
<td>{{product.name}}</td>
<td>{{product.price}}</td>
<td>{{product.description}}</td>
</tr>
</table>


Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się