如何使用来自不同控制器的范围

时间:2014-10-29 19:43:11

标签: javascript angularjs controller angularjs-scope

我有一个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

    1. 当我输入新记录时,我调用$ scope.refresh(),以便我可以刷新列表。 (这很好)

user.detail.cntrl

    1. 当我从列表中单击某个用户时,用户详细信息将加载到另一个视图中(正常工作)
    1. 当我更新user.detail时,我想调用$ scope.refresh()来更新user.list,但它无效。我无法调用$ scope.refresh()

我认为,因为我将同一个工厂注入两个控制器,我可以互相使用$ scopes。

关于如何使用$ scope.refresh()的任何想法(或在我更新user.detail.js时更新列表)

我用所有js文件制作一个plunker(plunker不起作用,它只显示我的代码) http://plnkr.co/edit/HtnZiMag0VYCo27F5xqb?p=preview

thanx看看这个

2 个答案:

答案 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();

它有效,但我不知道这是不是最好的方法。有什么意见吗?