ngResource使用$ delete从查询对象中删除记录

时间:2014-11-15 02:28:52

标签: javascript angularjs notifications

角度相当新颖。我想使用angular的$ resource库来使用我们的API服务。我在删除通过query()方法获得的记录的正确方法上有点迷失。具体来说,我们有一个用户通知的端点。我们希望在页面加载时获取所有用户通知,使用ng-repeat循环结果并在导航栏中显示通知。当用户单击删除图标时,应删除相应的通知。这是我目前所拥有的代码的精简版本:

JS:

angular.module('myapp', ['ngResource']).factory('Notifications',function($resource){
    return $resource('/apiv2/user/notifications/:id', {id:'@id'});
}).controller('NavigationController',['$scope','Notifications',function($scope, Notifications){
    $scope.notifications = Notifications.query();

    $scope.deleteNotification = function(notification){
        notification.$delete();
    };
}]);

HTML:

<ul>
    <li ng-repeat="notification in notifications">
        <i class="icon-remove" ng-click="deleteNotification(notification)"></i>
    </li>
</ul>

使用此代码,当用户单击删除图标时,单个通知对象将传递给deleteNotification方法,并通过api从后端正确删除。到目前为止,一切都按预期工作。但是,如果我在事后看了$ scope.notifications对象,那么刚刚删除的通知仍然会包含损坏的数据:

{$ promise:undefined,$ resolved:true}

理想情况下,我希望从通过.query()方法返回的对象中擦除此记录,以反映其在后端的状态,而无需执行新的.query()。

任何帮助将不胜感激!我为模糊的描述和/或不完整/不准确的代码道歉,我在晚餐时通过我的手机键盘输入内存,所以天知道我是否错过了什么。

1 个答案:

答案 0 :(得分:1)

更好的方式:(参见AngularJS ngResource delete event

$scope.deleteNotification = function (index) {
  $scope.notifications[index].$delete();
  $scope.notifications.splice(index, 1);
}

并在您的标记中执行

ng-click="deleteNotification($index)"

可能有更好的方法来执行此操作,因为这会引发控制台错误(但仍然有效),但这就是我正在做的事情:

$scope.notifications = Notifications.query();

$scope.deleteNotification = function(notification){
    notification.$delete();
    $scope.notifications = $scope.notifications.filter( function(n)
        return (n != notification);
    }); // filter everything but
};

如果使用下划线,则可以使用更漂亮的方式来编写删除内容。