Javascript 侦听事件并在不刷新的情况下更新页面

Javascript 侦听事件并在不刷新的情况下更新页面,javascript,angularjs,Javascript,Angularjs,我发现一个具体的逻辑问题有点难。我的问题是这样的: 我通过一些工厂方法从控制器内部发送PUT请求。我想在不刷新任何页面的情况下更新数据。对于POST和DEL,例如$state.go()或$location.path()等,我做了如下操作: $scope.$on('itemUpdt', (e, item) => { vm.allItems = vm.allItems.filter(item => { item._id !== item._id; });

我发现一个具体的逻辑问题有点难。我的问题是这样的:

我通过一些工厂方法从控制器内部发送PUT请求。我想在不刷新任何页面的情况下更新数据。对于POST和DEL,例如$state.go()或$location.path()等,我做了如下操作:

$scope.$on('itemUpdt', (e, item) => {
    vm.allItems = vm.allItems.filter(item => {
        item._id !== item._id;
    });
    vm.allItems.push(item);
});
$scope.$on('itemRemoved',(e,item)=>{
vm.allItems=vm.allItems.filter(项=>{
物品。_id!==物品。_id)
})
})
$scope.$on('itemsadded',(e,item)=>vm.allItems.push(item))
//例如,我想做这样的事情。。
$scope.$on('itemUpdt',(e,item)=>{
vm.allItems.push(item.findIndex('index of oldItem')).splice('exclude oldItem index').join(','))

})
JavaScript函数
push()
实际上返回数组的新长度,而不是数组本身。因此,对
push()
的返回值调用
findIndex()
,可能是导致问题的原因

您可以尝试以下方法:

$scope.$on('itemUpdt', (e, item) => {
    vm.allItems = vm.allItems.filter(item => {
        item._id !== item._id;
    });
    vm.allItems.push(item);
});

constfindindex=(数组,项)=>{
for(设i=0;i{
var indexToRemove=findIndex(vm.allItems,item);
vm.所有项目拼接(indexToRemove,1);
vm.allItems.push(项目);
});

vm.allItems是什么类型的对象?只是一个常规数组?是的,它是一个对象数组。我不好不提它。没问题。我假设是这样,只是必须确定。您的控制台中可能有错误。让我们知道这些错误是什么。您可以将前两个事件的闭包合并到第三个事件中,但这不会是第三个事件最好的方法。我通过传递'item'直接修改数组,所以它仍然是array类型。你确定吗?根据
vm.allItems.push(item)
应该返回数组的新长度-而不是实际数组。是的,你是对的。我本想做concat()但做了push()。谢谢提醒:)哦,那真的很干净。我过滤掉了旧的和新的项目,但后来又过滤了新的项目。非常感谢:)再次检查我添加了另一种方法。是的,第二种方法是我最初计划做的。新的es6和fp方法让我懒惰。顺便说一句,第3行有一个打字错误(数组[0])