【问题标题】:combining initial Razor output with Angular updates将初始 Razor 输出与 Angular 更新相结合
【发布时间】:2016-02-05 21:18:28
【问题描述】:

我有 ASP.NET5 / MVC6 应用程序。用户加载页面,Razor View 负责数据的输出。例如(这是一个虚构的例子,仅供说明):

<div>@Model.Quantity</div>

用户可以更新数量,这是通过 Angular $resource 服务的 POST 完成的。服务器上的 HttpPost 更新数据库,并以 JSON 格式返回新的数量。我想更新页面上的值而不刷新整个页面。很清楚如何在 JQuery 中做到这一点:

$("#quantity").html(data)

但如果可能的话,我想继续使用 Angular。所以,我想象这样的事情:

<div ng-controller="inventoryCtrl as vm">

<script>
vm.Model.Quantity = @Model.Quantity
</script>

<div>{{vm.Model.Quantity}}</div>
</div>

然后控制器中的回调函数会更新Model.Quantity

但这不起作用... vm 未定义。

一定有更好的方法!

【问题讨论】:

  • 我知道使用ng-init 不好,但试试&lt;div ng-controller="inventoryCtrl as vm" ng-init="vm.Model.Quantity = @Model.Quantity"&gt;
  • 大约有50个元素;其中一些是复杂的对象。如果我能做类似ng-init="vm.Model = @Model 的事情,我会这样做......

标签: javascript angularjs asp.net-mvc razor


【解决方案1】:

但这不起作用... vm 未定义。

你需要捕获this:

var that = this;

这样您就可以在资源上的 AJAX 请求的 then 回调中更新模型:

.then(function(result) {
    that.Model.Quantity = result;
});

更新:

我误解了你的问题。您似乎在初始渲染时遇到问题。这可以很容易地实现:

<script>
    var quantity = @Html.Raw(Json.Encode(Model.Quantity));
    // declare the quantity that came from the server as constant value
    app.constant('quantity', quantity);
</script>

可以注入到你的控制器中:

app.controller('MainCtrl', function (quantity) {
    this.Model.Quantity = quantity;
});

更新:

您也可以将整个对象图存储到一个常量中:

<script>
    var model = @Html.Raw(Json.Encode(Model));
    app.constant('model', model);
</script>

【讨论】:

  • 我在 AJAX 请求期间没有问题。问题在于页面的初始呈现。我想避免只显示标记,然后返回服务器获取数据。换句话说,我想渲染来自服务器的所有数据,但以后能够更新特定的值。
  • 我已经更新了我的答案,以说明如何注册一个常量值,然后将其注入 Angular 控制器。
  • 我理解你的建议。如果我在模型中有一些简单的(标量)变量,这将是一个很好的方法。但我的模型相当复杂。以数量为例,我可能有一个客户订单表,用户可以更改客户,然后加载新订单。同样,我完全通过 Angular 加载它们没有问题(加载空标记,然后单独加载数据);或在 AJAX 回调期间使用 JQuery 更改 DOM。但是把所有东西都变成常量看起来并不可行。是吗?
  • 没有什么能阻止您将整个对象图存储到一个常量中。很简单:var model = @Html.Raw(Json.Encode(Model));。然后定义你的常量:app.constant('model', model);。我也更新了我的答案来说明这一点。
  • 应该是一样的。我想Json.Encode 在 MVC6 中被删除了。
猜你喜欢
  • 2018-12-25
  • 2019-09-18
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
  • 2020-03-06
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多