Javascript 如何使用不同控制器的作用域

Javascript 如何使用不同控制器的作用域,javascript,angularjs,controller,angularjs-scope,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']); 在这两个控制器中,我向用户Fctr注入来自REST工厂的数

我有一个user.list.ctrl和一个user.detail.cntr。所有控制器都构建为一个模块,并注入到“用户模块”中,我将其注入到app.js中。(请参阅下面plunker中的完整代码)

我的控制器模块

angular.module('user-module', ['user-module.controllers']);
我的用户模块

angular.module('demo.app', ['user-module']);
在这两个控制器中,我向用户Fctr注入来自REST工厂的数据。(效果很好)

user.list.cntrl有一个$scope.refresh() user.detail.cntrl有一个$scope.update()

user.list.cntrl

  • 输入新记录时,我调用$scope.refresh()以便刷新列表。(这很好用)
user.detail.cntrl

  • 当我从列表中单击用户时,用户详细信息将加载到不同的视图中(正常工作)
  • 更新user.detail时,我想调用$scope.refresh()来更新user.list,但它不起作用。我无法调用$scope.refresh()
我认为,由于我将同一工厂注入两个控制器中,所以可以使用彼此$scopes

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

我用所有的js文件制作了一个plunker(plunker没有功能,只是为了显示我拥有的代码)


谢谢你来看看这个

这是一个非常概念化的问题

您已经为每个“片段”视图创建了一个控制器,因为它们用于不同的活动。这是控制器的用途。所以这是正确的

但是,您正在尝试访问刷新函数,该函数在一个控制器中写入,在另一个控制器中写入。从字面上看,这是错误的,因为从那时起,刷新在用户列表控制器或详细信息控制器中都不合适

用于控制(字面上)特定视图上发生的事情的函数是一个控制器。-这里有一个用于列表的控制器和一个用于详细信息的控制器

要在控制器之间共享的功能必须是服务。这正是您希望刷新功能成为的功能

无论何时将同一工厂注入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;
}]);
注册此factory服务后,您可以将其注入控制器,并且在需要刷新时,只需调用服务的公开方法并将新信息打印到视图中

希望它对你有用

我最后做了这样一件事:

我在列表中添加了以下内容:

 factoryId.listScope = $scope; 
由于我已经在细节控制器中注入了factoryId(我的数据服务),我可以将其称为:

factoryId.listScope.refresh();

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

我明白你的意思。我说得通。我会努力的,我会发回的。谢谢我试过了,我怎么称呼服务的“暴露方法”?你能澄清一下吗。又来了