当前位置: 首页 > 面试题库 >

Angular JS-使服务可以从控制器和视图全局访问

章翔宇
2023-03-14
问题内容

假设我们提供以下服务:

myApp.factory('FooService', function () { ...

然后,从控制器,我会说:

myApp.controller('FooCtrl', ['$scope', 'FooService', function ($scope, FooService) { ...

问题分为两部分:

  1. 全局可访问性 :如果我有100个控制器,并且所有人都需要访问该服务,则我不想显式注入它100次。 如何使服务在全球范围内可用? 目前,我唯一能想到的就是从根范围内包装它,这违背了目的。
  2. 视图的 可访问性:如何 从视图 内访问服务? 这篇文章建议从控制器内部包装服务。如果要花这么长的时间,似乎我应该只在根范围上实现功能?

问题答案:

找到了合理的解决方案。将其注入bootstrap方法(运行),并将其添加到根范围。从那里它将对所有控制器和视图可用。

myApp.run(function ($rootScope, $location, $http, $timeout, FooService) {
    $rootScope.foo = FooService;
    ....

重新阅读我上面提到的帖子,它没有完全说“包装”……只是“抽象”,所以我认为张贴者指的是相同的解决方案。

为了全面,对(1)的答案为:

myApp.controller('FooCtrl', ['$scope', function ($scope) { 
    // scope inherits from root scope
    $scope.foo.doSomething();
    ...

(2)的答案很简单:

{{doSomething()}}

添加克里斯托弗的评论以确保它被看到:

@rob-
根据最佳实践,应该将工厂注入需要使用它的控制器中,而不是在根范围上。如所问到的,第一个问题实际上是反模式。如果需要工厂100次,则注入100次。最小化时几乎没有任何多余的代码,并且可以很清楚地知道工厂的使用位置,并且通过在功能签名中列出所有必需的工厂,可以更轻松(更明显)地使用模拟方法测试那些控制器。–
Christopher WJ Rueber 13年11月25日在20:06



 类似资料:
  • 问题内容: 我已经阅读了几篇有关angularjs实体正确用法的文章:服务,工厂,控制器和指令。 我特别关心的是控制器和服务的比较。但是,没有一个帖子告诉我什么是控制器可以执行服务不能执行的操作,反之亦然。 可以列出它吗?或者仅仅是在angular的用法上规范? 问题答案: 控制器 通常用于绑定视图。控制器管理视图的生命周期,应将其视为视图控制器。将为视图的每个实例创建一个新的控制器,这意味着,如

  • 问题内容: 根据AngularJS的教程,控制器功能只是位于全局范围内。 http://docs.angularjs.org/tutorial/step_04 控制器功能本身是自动解析为封装范围还是驻留在全局范围内?我知道他们已经传递了对自己的$ scope的引用,但是看来函数本身只是位于全局范围内。显然,这可能会带来很多问题,而且我已经通过经验和教育学到了封装的方法。此外,如果它们确实存在于全球

  • 在iOS6中,我注意到了新的容器视图,但不太确定如何从包含视图访问它的控制器。 脚本: 我想从包含容器视图的视图控制器访问Alert view controller中的标签。 他们之间有一段距离,我能用吗?

  • 问题内容: 我正在尝试通过常规函数访问全局变量,这可能吗? 我已经使用$ rootScope设置了一些变量,并且我试图通过回调函数来访问它。从控制器调用此回调。我不想传递该回调。 有什么办法可以访问吗? 我愿意使用服务。 请提出建议。 谢谢 我试图按以下方式访问rootScope: 我的服务是: 它在updateStatus fn下显示isFBLoggedin为true,但未反映在视图上 我正在打

  • 问题内容: 是否可以在AngularJS控制器中创建 HTML 片段并将该HTML显示在视图中? 这是因为需要将不一致的JSON Blob转换为嵌套的对对列表。因此,在控制器中创建了 HTML ,现在我希望显示它。 我已经创建了模型属性,但是如果不打印 HTML 便无法在视图中呈现它。 更新资料 看来问题出在将创建的HTML角化为引号内的字符串而引起。将尝试找到解决此问题的方法。 控制器示例: 示

  • 问题内容: 是否可以在AngularJS控制器中创建 HTML 片段并将该HTML显示在视图中? 这是因为需要将不一致的JSON Blob转换为嵌套的对对列表。因此,在控制器中创建了 HTML ,现在我希望显示它。 我已经创建了一个模型属性,但是如果不打印 HTML 便无法在视图中呈现它。 更新资料 看起来问题出在将创建的HTML角化为引号内的字符串而引起。将尝试找到解决此问题的方法。 控制器示例