我正在努力确保正确使用我的角度应用程序的所有部分/所有正确的代码都在正确的位置。
我偶然发现了这篇文章 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
的摘要如果我可以做我要求的话,那么另一个问题是应该我?我认为替代方案是所有与服务的交互(以及其中的$资源)发生在控制器中(这是我迄今为止所做的)
非常感谢任何想法或建议。
答案 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
,如上所示。