AngularJS从$ resource触发$ scope.broadcast

时间:2014-07-25 05:42:28

标签: javascript angularjs angularjs-directive angularjs-service

简介

我正在努力确保正确使用我的角度应用程序的所有部分/所有正确的代码都在正确的位置。

我偶然发现了这篇文章 http://kirkbushell.me/when-to-use-directives-controllers-or-services-in-angular/ 它有一个示例应用程序,数据存储在服务内的数组中。我觉得应用程序的结构方式很有意义(但可能完全错误)。

问题

当$ resource操作触发时,我可以触发$ broadcast,就像我在此代码中更新数组时触发$ broadcast一样。

myApp.service( 'Book', function( $rootScope ) {

var service = {

    books: [
      { title: "Magician", author: "Raymond E. Feist" },
      { title: "The Hobbit", author: "J.R.R Tolkien" }
    ],
    addBook: function ( book ) {
        service.books.push( book );
        //console.log(service.books);
        $rootScope.$broadcast( 'books.update' );
    }
}

return service;

});

以下是一个工作示例http://plnkr.co/edit/y56oQvrvK6OgXJEPJSv7?p=previewin

的摘要

奖金问题

如果我可以做我要求的话,那么另一个问题是应该我?我认为替代方案是所有与服务的交互(以及其中的$资源)发生在控制器中(这是我迄今为止所做的)

非常感谢任何想法或建议。

1 个答案:

答案 0 :(得分:1)

是的,你可以做你要问的事。 $resource将返回具有$promise属性的对象/数组。您可以使用此承诺来了解服务器请求何时成功/失败。

在成功/失败处理程序中,根据需要执行$rootScope.$broadcast()。这是一项使用query()的{​​{1}}方法执行此操作的服务:

修改

这是完整的服务实现。请注意,你可以通过很多方式为这只猫设置皮肤,所以这些只是一些示例。

$resource

你应该这样做吗?

我没有看到这样做有很多伤害,但你至少应该考虑一下。您将从应用程序范围层次结构的顶部myApp.service( 'Book', function($rootScope, $resource ) { var myResource = $resource('/books/:id', { id: '@id' } ); var books; var service = { // this function broadcasts the result getBooks: function() { myResource.query( function(response) { $rootScope.$broadcast('it.worked', response); }, function(error) { $rootScope.$broadcast('it.failed', error); } ); }, // this function returns the $resource and also keeps a copy // so someone else may get the data with getBooksResult() getBooks2: function() { books = myResource.query(); books.$promise( function(response) { // if you still need to broadcast... $rootScope.$broadcast('it.worked'); }, function(error) { $rootScope.$broadcast('it.failed'); } ); return books; }, getBookResult: function() { return books; } } return service; }); 转到应用程序中的每个其他范围。

这可能会将活动发送到对此事件毫不关心的范围。请记住,您的应用程序中可能有许多范围(由控制器/指令创建)。在大多数情况下可能不是什么大问题。

关于$broadcast()的好处是它返回一个空对象,稍后用服务器响应填充。因此,您经常不需要求助于广播结果:)使用资源返回值的视图将自动更新。需要值(或错误)的控制器可以使用$resource中的$promise,如上所示。