问题标签 [angularjs-service]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
7489 浏览

angularjs - angularjs中的CacheFactory是单例吗?

我已经使用 CacheFactory 创建了一个服务。我期待它是一个单身人士。我将它注入我的控制器,它在控制器的范围内工作正常。但是,一旦我转到具有不同范围的不同页面,我似乎没有缓存中的值,这些值存储在不同范围的同一控制器中。CacheFactory 的行为不应该是一个单例,在我注入 CacheService 的任何地方都有相同的缓存对象吗?

以我的服务为例:

然后在我的控制器中:

0 投票
1 回答
26515 浏览

angularjs - 使用 Jasmine 测试一个简单的 AngularJS 服务

我有一个简单的服务,我正在尝试对其进行单元测试。无论我尝试什么,searchService 要么是未知的提供者,要么 service 为空(奇怪的是这不会导致我的测试失败!!)。

任何人都知道我可能做错了什么?

我正在尝试创建一个加载到 searchService 中的单元测试,以便我可以检查缓存的值:

0 投票
3 回答
779 浏览

angularjs - 分组后端 API

在使用 AngularJS 的 $http 服务时,我发现很难管理所有到后端的 url - 它们分布在控制器的代码中。有时它们甚至是重复的。大多数情况下,它们都是$http.get('/api/something').then(...).

将它们全部放到不同的服务中听起来很不合理:它只是一行代码,可能只是很小的修改(比如添加标题等)。

其他解决方案可能是将它们放入常量中,但在这种情况下,我仍然会使用$http.get(APIURLs.SomeURL)看起来有点冗长的...

所以问题是:管理后端 URL 的最佳方法是什么?

0 投票
2 回答
14008 浏览

angularjs - Angular JS:为什么 module.config 注入和控制器注入有区别?

这是我在挖掘 AngularJS 代码时无法弄清楚的,也许你可以帮助解开这个谜团。

为了展示它,我向 AngularJS 种子项目添加了一项服务:

您可以看到此提供程序公开了 $get 和某个 'providerMethod'。

现在,对于注入用法:如果我们调用 config,我们可以注入整个类并访问“外部”提供程序方法:

但是当我们将它注入控制器时(注意 Provider-less 名称),只有 $get 返回值被暴露:

控制台输出如下:它的我的服务 myServiceProvider: Constructor {providerMethod: function, $get: function} 它的我的 service.providerMethod MyCtrl1.myservice = Object {name: "stam"} stam

任何人都可以解释其中的区别吗?原因?非常感谢您的任何想法

里奥

PS:我在 angular-ui new ui-router 中看到了这种技术(优秀的项目!)。我需要访问外部提供程序类才能在茉莉花和其他地方进行注入 - 无济于事

0 投票
30 回答
777389 浏览

angularjs - AngularJS:服务vs提供者vs工厂

AngularJS 中的Service,Provider​​ 和有什么区别?Factory

0 投票
1 回答
669 浏览

angularjs - Can .$inject be used on Services in AngularJS, or is it needed only for Controllers?

I'm aware that for the purposes of minification and obfuscation we should always use the $injector (by way of controllerName.$inject = ['$service', '$service2']) to specify the actual service names that are required.

If I write a custom service that relies on other services, however, can/should I do the same thing? The only examples I can find for using the .$inject method are called on Controllers.

If I am doing

Should I append this?

myService.$inject = ['$rootScope', 'anotherService'];

Or perhaps it's applied to the module as a whole then?

myModule.$inject = ['$rootScope', 'anotherService'];

...But maybe in that case, the module is already keeping track of its services, and hence minification is not a concern?

0 投票
1 回答
1017 浏览

rest - AngularJS 控制器/服务/http 通信

我已经将我的 REST API 封装在一个注入控制器的 AnguarJS 服务中。很标准,对。现在我希望该服务拦截任何 401 响应并以某种方式触发注销或重新登录提示或其他内容。问题是:该服务无权访问任何范围。广播该错误的最佳方法是什么?我提出了一些想法,但我是 Angular 的新手,想知道是否有人可以告诉我这样做的“Angular”方式?

1)我可以让服务充当我的 AppCtrl 可以监听的事件池。但这似乎有点过于复杂。所以:

2)我可以将 $rootScope 注入服务,并直接修改服务isLoggedIn。但这似乎完全是错误的。我想明确区分服务服务数据、控制器控制范围以及指令与 dom 混在一起的地方。

3)我的每个控制器都可以监视一个被拒绝的承诺,如果原因是 401 错误,然后到达 $scope 并设置isLoggedIn为 false,但这个选项显然很糟糕。

有什么帮助吗?

谢谢。

0 投票
1 回答
79 浏览

javascript - 从函数评估值时,$watch 似乎不起作用

我有一个渲染 gridBlocks 的中继器。这些块中的每一个都具有“Vote Good”“Vote Bad”“No vote” (出于我们的目的)的属性。除其他外,该属性控制块的 CSS 类。

用户投票的数据结构通过 访问userService,它公开了更新投票、执行 ajax 调用等的方法。

我的问题是这样的:

voteClass通过调用userService. 我想查看此属性并在其模型更改时相应地更新 UI。

但是,这似乎不起作用-即使值确实发生了变化,voteClass也不会重新评估并且不会调用。$watchgetVoteClass(scope.block.id)

我试过使用$apply,但这似乎并没有改变任何东西。

非常感谢您的意见...

Update1:我认为即使getVoteClass(scope.block.id)更改的值,块范围属性也不会。有没有办法强制块范围重新评估其属性?

更新 2 - 问题已解决:在CaioToOn 和 Gloopy 的帮助下,我意识到错误在于范围属性引用了原始字符串这一事实。为了克服这个问题,您可以观察一个函数,或者使用对对象属性的直接引用(而不是原始字符串)。


控制器:

指示:

0 投票
1 回答
12564 浏览

angularjs - Angularjs - 如何在服务中设置模块值?

我有一个 Angular 应用程序的以下服务模块。

用户登录后,login服务返回一个唯一的会话 id,我想设置模块的uid值以供其他服务调用参考。

我很确定上面的代码不起作用,因为我不能在模块的配置阶段使用值作为依赖项。如何在服务中设置uidlogin并在模块内的其他服务中访问它,或者如果这不可能,我如何创建可以由这些服务设置/获取的值?

0 投票
10 回答
114983 浏览

angularjs - AngularJS:绑定到服务属性的正确方法

我正在寻找如何在 AngularJS 中绑定到服务属性的最佳实践。

我已经通过多个示例来了解如何绑定到使用 AngularJS 创建的服务中的属性。

下面我有两个示例说明如何绑定到服务中的属性;他们都工作。第一个示例使用基本绑定,第二个示例使用 $scope.$watch 绑定到服务属性

在绑定到服务中的属性时是否首选这些示例中的任何一个,或者是否有另一个我不知道的选项会被推荐?

这些示例的前提是服务应每 5 秒更新其属性“lastUpdated”和“calls”。更新服务属性后,视图应反映这些更改。这两个例子都成功地工作了;我想知道是否有更好的方法来做到这一点。

基本绑定

可以在此处查看和运行以下代码:http: //plnkr.co/edit/d3c16z

我解决绑定到服务属性的另一种方法是在控制器中使用 $scope.$watch。

$scope.$watch

可以在此处查看和运行以下代码:http: //plnkr.co/edit/dSBlC9

我知道我可以在服务中使用 $rootscope.$broadcast 并在控制器中使用 $root.$on ,但是在我创建的其他示例中,在第一次广播中使用 $broadcast/$ 不会被控制器,但在控制器中触发了广播的其他调用。如果您知道解决 $rootscope.$broadcast 问题的方法,请提供答案。

但是为了重申我之前提到的内容,我想知道如何绑定到服务属性的最佳实践。


更新

这个问题最初是在 2013 年 4 月提出并回答的。2014 年 5 月,Gil Birman 提供了一个新答案,我将其更改为正确答案。由于 Gil Birman 的回答几乎没有赞成票,我担心阅读这个问题的人会无视他的回答,转而支持更多投票的其他答案。在您决定最佳答案之前,我强烈推荐 Gil Birman 的答案。