我没有明确调用$apply但仍然收到错误:[$rootScope:inprog] $apply已经在进行中



在一个有角度的工厂中,我有一个创建新项目的方法,该方法与用户有连接,并将价格添加到用户的"项目"数组中(如购物车)。因此,我必须查看用户是否存在于我的本地用户阵列中,如果不存在,则在服务器上,如果没有,则创建用户。

代码如下:

var saveItem = function (item) {
    var user = filterUserById(item.ownerId);
    if (user) {
        user.createItem(item);
    } else {
        repository.getUserById(item.ownerId).then(
        function (serverUser) {
            var userViewModel = repository.getUserViewModel(serverUser);
            userViewModel.createItem(item);
            users.push(userViewModel);
        }
        , function () {
            user = {
                id: item.ownerId,
                items: [
                    createItemDto(item)
                ]
            };
            repository.createUser({ id: user.id }, user);
            users.push(repository.getUserViewModel(user));
        });
    }
};

无论发生哪种"情况"(用户是在本地、服务器上找到的,还是创建并添加的),我都会得到一个错误:

错误:[$rootScope:inprog]$应用已在进行中http://errors.angularjs.org/1.3.0-beta.18/$rootScope/inprog?p0=%24应用

我认为这可能与我正在使用存储库中的资源有关,但我认为资源不应该(因为它是angular的一部分)

user.createItem = function (item) {
    var resource = userResource
        , itemDto = createItemDto(item)
        , command = [{
        Type: 'add',
        Name: 'items',
        Value: itemDto
    }];
    resource.createItem({ id: item.ownerId }, command);
    this.items.push(itemDto);
};

你不知道!?请HLP!:'(

附言:在我的代码中,我没有任何明确的调用来应用、编译或摘要。

发现问题!我放了一个小代码行,在添加项目和清空表单后,将重点放在正确的输入上。这包括一个

$('selector').focus();

这与摘要周期相冲突。。。解决方案:

$timeout($('selector').focus());

尝试将对user.createItem(item)的调用封装在$timeout函数中:

$timeout(function() {
  user.createItem(item);
}, 0);

您可能会以其他方式触发对$scope.$apply()的其他调用。

或者,尝试使用$scope.$evalAsync(function())

这里有一些好的信息:inprog

最新更新