javascript - AngularJS 从 $resource 触发 $scope.broadcast

标签 javascript angularjs angularjs-directive angularjs-service

简介

我试图确保我正确使用 Angular 应用程序的所有部分/所有正确的代码都在正确的位置。

我看到了这篇文章 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

奖励问题

如果我可以做我所要求的事情,那么另一个问题是我应该吗?我认为另一种选择是让所有与服务(以及其中的 $resource)的交互发生在 Controller 中(这是我到目前为止所做的)

如有任何想法或建议,我们将不胜感激。

最佳答案

是的,您可以按照您的要求进行操作。 $resource 将返回一个具有 $promise 属性的对象/数组。您可以使用此 promise 来了解服务器请求何时成功/失败。

在成功/失败处理程序中,您可以根据需要执行$rootScope.$broadcast()。下面的服务使用 $resourcequery() 方法来执行此操作:

编辑

这是完整的服务实现。请注意,您可以通过多种方式给这只猫剥皮,因此这些只是一些示例想法。

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() 一个事件。

这可能会将事件发送到根本不关心该事件的范围。请记住,您的应用程序中可能有很多范围(由 Controller /指令创建)。在大多数情况下可能没什么大不了的。

$resource 的好处是它返回一个空对象,稍后用服务器响应填充。很多时候,您不需要广播结果:)使用资源返回值的 View 将自动更新。需要值(或错误)的 Controller 可以使用 $resource 中的 $promise,如我上面所示。

关于javascript - AngularJS 从 $resource 触发 $scope.broadcast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24948781/

相关文章:

angularjs - Angular - 单击时更新指令模板

javascript - 如何将无限参数和一个或两个参数传递给 JavaScript 函数?

javascript - 使用 Angular JS 添加图像

javascript - Ionic/cordova 屏幕方向不起作用

javascript - ionic http 获取本地文件给出 http 错误代码 0?

angularjs - ng-view 不适用于 Microsoft Edge

angularjs - 将新数据添加到滚动上的预输入结果中

Javascript 与 php 和 mysql 空值冲突(语法)

c# - 是否有支持分层模板的 PHP/Javascript/c#/java 或 ruby​​ 模板引擎?

javascript - Webapi 导出到 excel 下载的损坏文件