Vue.js 组件在从服务器返回错误后停止工作

Posted

技术标签:

【中文标题】Vue.js 组件在从服务器返回错误后停止工作【英文标题】:Vue.js component stops working after returning error from server 【发布时间】:2017-06-17 00:21:43 【问题描述】:

我有一个像 x-editable 插件一样工作的大组件:当用户点击字段时,它变成可编辑的,当用户点击外部时 - 字段变成简单的文本,并且带有新数据的请求被发送到服务器进行验证和存储新值。

当服务器返回代码 200(验证已通过)时 - 一切正常。 当服务器在响应正文中返回带有错误文本的代码 403 时 - 任何后续点击都不会触发更新事件;

这是我的 vue.js 组件的摘录(每当输入更改时调用的函数)

onInputChange() 
            switch(this.inputType) 
                case "select":
                    this.value = this.input.select2("val");
                    break;
                case "date":
                    let d = this.input.datepicker("getDate");
                    if(d) 
                        this.value = moment(d).format("DD/MM/YYYY");
                    
                    break;
                case "phone":
                    this.value = this.input.val();
                    break;
                case "password":
                    this.value = this.input.val();
                    break;
            
            if(this.postUrl) 
                let self = this;
                self.errorText = "";
                self.isProcessing = true;
                this.$http.post(this.postUrl, 
                    name: this.name,
                    pk: this.pk,
                    value: this.value
                ).then((response) => 
                    // saved
                    self.isProcessing = false;
                    if(self.isEnabled) 
                        switch(self.inputType) 
                            case "date":
                                self.input.datepicker("hide");
                                break;
                        
                        self.isEnabled = false;
                    
                    if(self.model && self.pk) 
                        window.VueBus.$emit(self.model + "_" + self.pk);
                    
                , (response) => 
                    self.errorText = response.body;
                    self.isProcessing = false;
                )
            

        ,

这是一个错误,我在控制台中看到了

app-vue.js:1860 POST http://localhost:8000/user/edit 403(禁止)

在网络选项卡中,我看到请求返回了正确的错误消息:“输入太短”

【问题讨论】:

控制台出现任何错误? DD/MM/YYYY 不是有用的日期格式。每当您在技术系统之间传输日期时,请使用YYYY-MM-DD,无一例外。您始终可以格式化日期以供显示,但对于传输或存储在文件中,您真的应该使用标准化格式。 YYYY-MM-DD 确实是可取的,但时间戳是一个不错的选择。 嗯,这可能不是直接的 vue 问题——你有一些限制和后端,所以 API 返回 403 状态码。所以考虑让你的代码向服务器发送正确的数据。 这与后端无关。 Vue.js 组件在服务器返回 403 时接收数据并在组件内部设置 errorText。问题是:它在它之后停止更新。 【参考方案1】:

由于某种原因,这个差异解决了问题

@@ -5,7 +5,7 @@
                    'form-group': true,
                    'floating-label-form-group': true,
                    'col-lg-12': true,
-                   'has-error': errorText,
+                   'has-error': errorText.length,
                    'floating-label-form-group-with-value': value.length > 0,
                    'floating-label-form-group-editing': isEnabled
            "
 @@ -110,7 +110,7 @@

                    </span>

-           <p class="help-block" v-if="errorText">
+           <p class="help-block" v-show="errorText.length">
                     errorText 
            </p>

我在模板中将errorText 替换为errorText.length。在所有情况下,errorText 只是一个字符串(没有 html 格式)。

【讨论】:

以上是关于Vue.js 组件在从服务器返回错误后停止工作的主要内容,如果未能解决你的问题,请参考以下文章

Vue.js 模态窗口在从另一个组件单击时未打开

Vue.js 路由和 JQuery - 从路由返回

(Nuxt.js/Vue.js) - 脚本只运行一次,更改路由/刷新页面后停止运行

响应失败后如何停止http响应

Vue.js - 组件模板不使用 v-for 渲染

Vue js + 获取服务工作者注册对象的麻烦