gpt4 book ai didi

javascript - 在 POST 之后处理从 Angular Controller 到指令的成功/错误 DOM 操作

转载 作者:行者123 更新时间:2023-11-30 12:32:51 25 4
gpt4 key购买 nike

我一直在这里和那里学习一些 Angular ,但我不太明白处理来自服务器的成功/错误响应的 Angular 方式是什么。典型的 jQuery 方法是:

  • 序列化表单中的数据
  • $.post 数据到服务器
  • 服务器验证数据,以成功或错误数据响应
  • 使用 jQuery 操作 DOM 以显示来自服务器的成功/错误数据。

在 Angular 中,我们有操纵 DOM 的指令,我们有处理模型的 Controller 。假设我们有以下内容:

form.html

<div ng-controller="myController">
<span class="hidden success-message"></span>
<form>
<label> Name </label>
<input type="text" name="name" ng-model="name">
<span class="name-error hidden"></span>
<label> Occupation </label>
<input type="text" name="occupation" ng-model="occupation">
<span class="occupation-error hidden"></span>

<input submit-directive type="submit" id="submit" value="Submit">
</form>
</div>

app.js

angular.module('app', []).controller('myController', [$scope, $http, function($scope, $http) {
$scope.name = "";
$scope.occupation = "";

$scope.doSubmit: function(formData) {
$http.post("/save", formData)
.success(function(response) {
$scope.name = response['name']
$scope.occupation = response['occupation']

// How to pass success messages back to directive?

}.fail(function(err) {

// How to pass error messages back to directive?

}
}
});

angular.module('app', []).directive('submit-directive', function() {
return {
restrict: 'A',
link: function(scope, element, attrs) {
element.click(function() {
// Pass form data back to controller
scope.$apply('doSubmit(\"' + $("form").serialize() +'\")');
});

// How do I get the success/fail results from the Controller so that I can manipulate the DOM?

}
};
});

在这里,用户输入他们的姓名职业。提交后,指令获取表单数据并将其呈现给 Controller 以进行 POST 请求。返回响应时,指令应显示成功消息或显示错误消息。

我不清楚如何将 Controller 的响应传递给 DOM 操作指令。

我想到的唯一方法是创建一个$watch:

// in controller
$scope.isFormPostSuccess = false;
$scope.formResponse = null;
// ....
.success(function(response) {
$scope.isFormPostSuccess = true;
$scope.formResponse = response;
}.fail(function(err) {
$scope.isFormPostSuccess = false;
$scope.formResponse = err;
}

然后在指令中,我会观察这些变量的变化并采取相应的行动。但是,这种方式感觉非常困惑,而且似乎不能很好地适应较大的应用程序或具有许多独立表单的情况。我也可以将所有 DOM 操作移到 Controller 中,但那是糟糕的设计。

什么是正确的 Angular 方式?

最佳答案

其实,所谓的“Angular way”应该是将models($scope.foo)和directives(like ng-model, ng-bindng-show 等,或您的自定义指令)来实现 DOM 操作的目标。它不像在 Controller 中手动启动 DOM 操作,而是在 Controller 中更改模型,DOM 将在指令的帮助下相应地更新自身。

在您的情况下,如果您只想显示成功/错误消息,我认为您不需要使用自定义指令。


首先,您应该将相关的表单字段包装在单个模态对象中,而不是多个模态对象中。喜欢:

<input type="text" name="name" ng-model="person.name">

<input type="text" name="occupation" ng-model="person.occupation">

其次,您应该使用 ng-submitng-click 进行表单提交操作,例如:

<input type="submit" id="submit" value="Submit" ng-click="doSubmit(person)">

<form ng-submit="doSubmit(person)">
...
<input type="submit" id="submit" value="Submit">
</form>

第三,您应该使用ng-model 而不是serialize() 从表单中获取数据。就像在 How can I post data as form data instead of a request payload? 中讨论的那样:

$scope.doSubmit = function(formData) {    // use `=` instead of `:` here
$http({
method: "POST",
url: "/save",
data: $.param(formData),
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
})
// ...
}

最后,如果你想向用户显示一些文本以外的反馈,你应该使用ng-showng-switchng- classng-style 可能的话。喜欢:

<span class="name-error" ng-show="errorMessage.name" ng-bind="errorMessage.name"></span>

并在 fail() 回调中显示名称错误消息时:

errorMessage.name = "Some error message here.";  // don't forget to initialize errorMessage to an empty object

就是这样!


更新

对于您在评论中提出的问题,我认为,在 Angular 中,人们可能更喜欢对单个 DOM 元素或嵌套指令使用单独的内聚指令,然后将它们与模型或 Controller (嵌套指令)连接起来。

在您的示例中,我建议您结合使用两者。

首先,为 UI 目的使用一组嵌套指令。您可能有一个指令绑定(bind)到 body 标签并在那里访问视口(viewport)信息。然后您可以使用 require: '^ParentDirective' 在内部指令中访问它。

然后,您可以将模型绑定(bind)到内部指令。因此,您将数据和 UI 操作分开。

例如

<body auto-size-messages>
<div ng-repeat="message in messages" message="message"></div>
</body>

auto-size-messages 中,您可以获得视口(viewport)属性并将其分配给 Controller 。而在message中,您可以操作DOM将消息放置在您想要的位置,并根据消息属性显示内容。

您可以引用 https://docs.angularjs.org/guide/directive 中的创建包装其他元素的指令部分对于嵌套指令。

关于javascript - 在 POST 之后处理从 Angular Controller 到指令的成功/错误 DOM 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27054523/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com