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

时间:2014-09-07 22:58:06

标签: angularjs

在角度工厂中,我有一种方法来创建一个新项目,该项目与用户有关联,并且价格要添加到该用户" items"数组(如购物车)。所以我必须查看用户是否在我的本地用户数组中,如果不存在于服务器上,如果没有则创建用户。

代码如下所示:

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 =%24apply

我认为这可能与我在我的存储库中使用资源的事实有关,但我不认为资源应该(因为它是角度的一部分......)。这是user.createItem方法,代码:

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);
};

你不喜欢!? PLS HLP! :'(

P.S。我没有明确要求在我的代码中的任何地方申请,编译或摘要。

2 个答案:

答案 0 :(得分:2)

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

$('selector').focus();

这与消化周期相撞......解决方案:

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

答案 1 :(得分:0)

尝试将您的来电包裹在user.createItem(item)函数中的$timeout

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

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

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

以下是一些不错的信息:inprog