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