2013-03-15 60 views
6

在我的角度应用程序后,认为我有一个控制器如下:

function TemplateListControl($scope, TemplateService){ 
    $scope.templates = TemplateService.get(); // Get objects from resource 

    // Delete Method 
    $scope.deleteTemplate = function(id){ 
     $scope.templates.$delete({id: id}); 
    } 
} 

在我绑定到templates模型表多数民众赞成的观点。如下:

<table ng-model="templates"> 
    <thead> 
     <tr> 
      <th style="width:40%">Title</th> 
      <th style="width:40%">controls</th> 
     </tr> 
    <thead> 
    <tbody> 
     <tr ng-repeat="template in templates"> 
      <td> 
       <!-- Link to template details page --> 
       <a href="#/template/[[template.id]]"> 
        [[template.title]] 
       </a> 
      </td> 
      <td> 
       <!-- Link to template details page --> 
       <a class="btn btn-primary btn-small" 
        href="#/template/[[template.id]]">Edit 
       </a> 
       <!-- Link to delete this template --> 
       <a class="btn btn-primary btn-small" 
        ng-click="deleteTemplate(template.id)">Delete 
       </a> 
      </td> 
     </tr> 
    </tbody> 
</table> 

现在,当我点击上面的模板删除链接,它调用deleteTemplate方法和成功的DELETE调用的REST API制作。但该视图在更新之前不会更新,并且$scope.templates = TemplateService.get();会再次启动。我究竟做错了什么?

回答

1

您还需要更新客户端,以便修改源代码如下

ng-click="deleteTemplate($index)"> 


$scope.delete = function (idx) { 
    var templateid = $scope.templates[idx]; 

    API.Deletetemplate({ id: templateid.id }, function (success) { 
    $scope.templates.splice(idx, 1); 
    }); 
}; 
+0

以及我们如何知道对REST API的异步调用是否成功?我很安静,确保angular的资源应该自行更新视图。如果我们手动更新客户端数据,我们还需要手动执行错误处理,这对我来说似乎是相反的。 – Amyth 2013-03-15 11:14:42

+0

请你分享一下小提琴吧 – 2013-03-15 11:35:22

0

你可以传递一个回调函数$资源。$删除

function TemplateListControl($scope, TemplateService){ 
    $scope.templates = TemplateService.get(); // Get objects from resource 

    // Delete Method 
    $scope.deleteTemplate = function(id){ 
    TemplateService.$delete({id: id}, function(data) { 
     $scope.templates = data; 
    }); 
    } 
} 

注意 如果您REST API的delete函数返回一个数组,你必须在你的Angular $资源中设置isArray:true以避免AngularJS $资源错误 - TypeError:Object#没有方法'push'

$resource(URL, {}, { 
    delete: {method:'DELETE', isArray: true} 
}); 
3

我更喜欢使用promise而不是回调。 Promise是处理异步进程的新方法。您可以在从服务器返回后立即检查结果。

//Controller 
myApp.controller('MyController', 
    function MyController($scope, $log, myDataService) { 

$scope.entities = myDataService.getAll(); 
$scope.removeEntity = function (entity) {  
     var promise = myDataService.deleteEntity(entity.id); 
     promise.then(
      // success 
      function (response) { 
       $log.info(response); 
       if (response.status == true) { 
        $scope.entities.pop(entity); 
       } 
      }, 
      // fail 
      function (response) { 
       $log.info(response); 
       // other logic goes here 
      } 
     ); 
    }; 
}); 

//DataService 
myApp.factory('myDataService', function ($log, $q, $resource) { 

return { 
    getAll: function() { 
     var deferred = $q.defer(); 
     $resource('/api/EntityController').query(
      function (meetings) { 
       deferred.resolve(meetings); 
      }, 
      function (response) { 
       deferred.reject(response); 
      }); 

     return deferred.promise; 
    }, 

    deleteEntity: function (entityId) { 
     var deferred = $q.defer(); 
     $resource('/api/EntityController').delete({ id: entityId}, 
      function (response) { 
       deferred.resolve(response); 
      }, 
      function (response) { 
       deferred.reject(response); 
      }); 

     return deferred.promise; 
    } 
    }; 
}); 

//Web API Controller 
public class MeetingController : BaseApiController 
{ 
    // .... code omited 

    public OperationStatus Delete(int entityId) 
    { 
     return _repository.Delete(_repository.Single<MyEntity>(e => e.EntityID == entityId)); 
    } 
} 

注意:$ log,$ q,$ resource是在服务中构建的。希望它有助于:)

相关问题