【问题标题】:I'm not calling $apply explicitly but still get Error: [$rootScope:inprog] $apply already in progress我没有明确地调用 $apply 但仍然得到 Error: [$rootScope:inprog] $apply already in progress
【发布时间】:2014-09-07 22:58:05
【问题描述】:

在 Angular 工厂中,我有一种创建新商品的方法,该商品与用户建立连接,并为该用户的“商品”数组(如购物车)添加价格。因此,我必须查看用户是否存在于我的本地用户数组中,如果不存在则在服务器上,如果不存在则创建用户。

代码如下所示:

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] $apply 已经在进行中 http://errors.angularjs.org/1.3.0-beta.18/$rootScope/inprog?p0=%24apply

我认为这可能与我在存储库中使用资源的事实有关,但我认为资源不应该(因为它是 angular.. 的一部分)。这里是 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);
};

你不工作!?请帮助! :'(

附:我在代码中的任何地方都没有任何明确的调用来应用、编译或消化。

【问题讨论】:

    标签: angularjs


    【解决方案1】:

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

    $('selector').focus();
    

    这与摘要循环冲突...解决方案:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      这里有一些很好的信息:inprog

      【讨论】:

      • 感谢您的建议。我已经为自己制定了一条规则,永远不要明确触发应用。我不会在此解决方案中的任何地方触发它。有可能我的代码以某种方式隐式触发了我不知道的应用,这似乎不合逻辑'因为如果是这样,那将是一个不兼容的角度方法本身......但我可能已经使用了某些部分以一种非预期的方式角度...我会尝试你的提示。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 2014-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多