当前位置: 首页 > 知识库问答 >
问题:

$rootScope:inprog$apply已在进行中。更改事件错误

彭风华
2023-03-14

在我的项目中,我试图上传一个图像,将其作为数据URL读取,并将其存储到我的数据库中。

我的超文本标记语言ng-Click的调用这些方法与true或false作为参数(一个做身体图像和其他一个配置文件图像)

根据调用true还是false,它会更改事件的id。

出于某种原因,当它的“真”时,一切都运行得非常好。用户可以选择图像,将其正确发送到数据库,并正确加载图像。

然而,当调用“false”时,我得到了错误:

[$rootScope:inprog]$apply已在进行中

然后console.log()测试2222没有被调用。

Html

<img src="{{controller.myCause.causeImage}}" ng-click="controller.uploadImage('true')" alt="Your Image Here" class="cause-img" id="profileImage" style="width: 80%; height: 35%;" height="300" />
<input id="imageUpload" type='file'>

<img src="{{controller.myCause.causeThumbnailImage}}" ng-click="controller.uploadImage('false')" alt="Your Thumbnail Here" id="profileImageThumb" class="cause-img" style="width: 80%; height: 20%;" height="200" />
<input id="profileImageUpload" type='file'>

客户端

/////////////////////////////////////
//Begin Uploading Cause Profile Image
public uploadImage(bool) {
    if (bool === "true") {
        $("#imageUpload").click();
        this.imgUpload(bool);
    } else {
        $("#profileImageThumb").click();
        this.imgUpload(bool);
    }
}

public imgUpload(bool) {
    console.log(bool);
    var _this = this;
    var id = "";
    var imgId = "";

    if (bool === "true") {
        id = "#imageUpload";
        imgId = "#profileImage";
    } else {
        id = "#profileImageUpload";
        imgId = "#profileImageThumb";
    }

    console.log("111");

    $(id).change(function () {
        console.log("2222");
        if (this.files && this.files[0]) {
            var reader = new FileReader();
            reader.readAsDataURL(this.files[0]);
            $(imgId).attr('src', this.files[0]);
            _this.convertFileToBase64AndSet(this.files, bool);
        }  
    });

};

convertFileToBase64AndSet(fileList: FileList, bool) {
    var self = this;
    if (fileList.length > 0) {
        var reader = new FileReader();

        reader.onloadend = (e: Event) => {
            self.postProfileImage(reader.result, bool);
        }
        reader.readAsDataURL(fileList[0]);
    }
}

public postProfileImage(file, bool) {

    if (bool === "true") {
        this.$http.put(`api/causes/profpic`, JSON.stringify(file)).then((res) => {
            this.$state.reload();
        });
    } else {
        this.$http.put(`api/causes/thumbpic`, JSON.stringify(file)).then((res) => {
            this.$state.reload();
        });
    }
}
//End Cause Profile Image Upload
////////////////////////////////

共有2个答案

傅玮
2023-03-14

类似于哈桑的回答,我得到了这个答案。

public uploadImage(bool) {
    var self = this;
    var id = "";
    if (bool === "true") {
        id = "#imageUpload";
    } else {
        id = "#profileImageUpload";
    }
    setTimeout( () => {
        $(id).click();
        self.imgUpload(bool);
    });
}

谢谢哈桑为我指明了正确的方向。setTimeout确实有效!

凌善
2023-03-14

您的单击事件正在运行与当前摘要周期冲突的摘要周期。

您可以使用setTimeout()

你能试试这个吗

public uploadImage(bool) {
    if (bool === "true") {
        setTimeout(function({$("#imageUpload").click();})            
        this.imgUpload(bool);
    } else {            
        setTimeout(function({$("#profileImageThumb").click();})
        this.imgUpload(bool);
    }
}
 类似资料:
  • 问题内容: 堆栈跟踪: 引用此代码http://pastebin.com/B9V6yvFu 奇怪的是,在我的LG4X上它可以正常工作,但是在我的三星s2上它会抛出上述错误。有什么想法怎么了? 问题答案: 因为在现有的消化周期内进行调用,所以收到此错误。 最大的问题是:您为什么打电话?除非您是从非Angular事件进行接口的,否则您根本不需要调用。通常的存在意味着我做错了事(除非,再次,$ appl

  • 问题内容: 我发现自从以角度构建应用程序以来,我需要越来越多地手动将页面更新到我的范围。 我唯一知道的方法是从控制器和指令的范围进行调用。问题是它不断向显示以下内容的控制台抛出错误: 错误:$ digest已经在进行中 有谁知道如何避免这种错误或以不同的方式实现相同的目的? 问题答案: 不要使用此模式 -最终将导致更多错误,无法解决。即使您认为它可以修复某些问题,也没有。 您可以通过检查来检查a

  • 有没有人知道如何避免这个错误,或者实现同样的事情,但以不同的方式?

  • 问题内容: 尝试致电时出现此错误 错误是 问题答案: 复制: 防止在调用$ scope。$ apply()时发生错误$digest。 您收到的错误表明Angular的脏检查已经在进行中。 最新的最佳实践表明,如果要在下一个 摘要 迭代中执行任何代码,则应使用: 上一页反应: (不要使用此方法) 使用安全的申请,例如: 你为什么不反转条件?

  • 当被监控目录中的文件的ReadOnly属性更改时,FileSystemMonitor似乎没有触发“更改”事件(没有其他事件)。 这是我的测试代码: 使用该代码,我接收到很多“更改”事件,例如,如果修改时间戳已更改,但如果我更改任何标准属性(如ReadOnly或Hidden),则不会。 我错过了什么,还是我击中了一个“特征”?

  • 问题内容: 如果使用jQuery添加或更改CSS类,如何触发事件?更改CSS类是否会触发jQuery 事件? 问题答案: 每当您在脚本中更改类时,都可以使用A 引发自己的事件。 但是否则,没有什么办法可以在类更改时触发事件。仅在焦点离开输入已更改的输入后才触发。