我有一个user.list.ctrl和一个user.detail.cntr。所有控制器都构建为一个模块,并注入一个“用户模块”,我在app.js中注入。 (参见下面的plunker中的完整代码)
我的控制器模块
angular.module('user-module', ['user-module.controllers']);
我的用户模块
angular.module('demo.app', ['user-module']);
在两个控制器中,我向user-Fctr注入来自REST工厂的数据。 (效果很好)
user.list.cntrl有$ scope.refresh() user.detail.cntrl有$ scope.update()
user.list.cntrl
user.detail.cntrl
我认为,因为我将同一个工厂注入两个控制器,我可以互相使用$ scopes。
关于如何使用$ scope.refresh()的任何想法(或在我更新user.detail.js时更新列表)
我用所有js文件制作一个plunker(plunker不起作用,它只显示我的代码) http://plnkr.co/edit/HtnZiMag0VYCo27F5xqb?p=preview
thanx看看这个
答案 0 :(得分:1)
这是一个非常概念性的问题。
您已为每个"片段"创建了一个控制器。因为它们适用于不同的活动。这是控制器的目的。这是对的。
但是,您尝试访问另一个控制器中写入的刷新功能。从字面上看,这是错误的,因为那时刷新在用户列表控制器或细节控制器内是不合适的。
用于控制(字面上)特定视图上发生的事情的功能是控制器。 - 您有正确的列表控制器和详细信息。
要在控制器之间共享的功能必须是服务。这正是您想要的刷新功能。
每当您将同一工厂注入n个控制器时,您就无法使用每个控制器的范围。这不是控制器的目的。
但是,无论何时将同一工厂注入n个控制器,都可以使用其公开的方法。
您遇到的问题可以通过以下方式解决:
app.factory( 'sharedFunctions', [ 'factoryId', function sharedFunctions( factoryId ) {
var refresh = function () {
factoryId.getAll(/*your params to query*/)
.success( function ( response ) {
//This will return the list of all your records
return response;
});
};
return sharedFunctions;
}]);
注册此工厂服务后,您可以将其注入控制器,无论何时需要刷新,只需调用服务的公开方法并将新信息绘制到视图中。
希望它适合你!
答案 1 :(得分:0)
我最终这样做了:
我在list.contrl中添加了这个:
factoryId.listScope = $scope;
因为我已经在详细控制器中注入了factoryId(我的数据服务),所以我可以这样称呼:
factoryId.listScope.refresh();
它有效,但我不知道这是不是最好的方法。有什么意见吗?