问题标签 [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.
angularjs - angularjs中的CacheFactory是单例吗?
我已经使用 CacheFactory 创建了一个服务。我期待它是一个单身人士。我将它注入我的控制器,它在控制器的范围内工作正常。但是,一旦我转到具有不同范围的不同页面,我似乎没有缓存中的值,这些值存储在不同范围的同一控制器中。CacheFactory 的行为不应该是一个单例,在我注入 CacheService 的任何地方都有相同的缓存对象吗?
以我的服务为例:
然后在我的控制器中:
angularjs - 使用 Jasmine 测试一个简单的 AngularJS 服务
我有一个简单的服务,我正在尝试对其进行单元测试。无论我尝试什么,searchService 要么是未知的提供者,要么 service 为空(奇怪的是这不会导致我的测试失败!!)。
任何人都知道我可能做错了什么?
我正在尝试创建一个加载到 searchService 中的单元测试,以便我可以检查缓存的值:
angularjs - 分组后端 API
在使用 AngularJS 的 $http 服务时,我发现很难管理所有到后端的 url - 它们分布在控制器的代码中。有时它们甚至是重复的。大多数情况下,它们都是$http.get('/api/something').then(...)
.
将它们全部放到不同的服务中听起来很不合理:它只是一行代码,可能只是很小的修改(比如添加标题等)。
其他解决方案可能是将它们放入常量中,但在这种情况下,我仍然会使用$http.get(APIURLs.SomeURL)
看起来有点冗长的...
所以问题是:管理后端 URL 的最佳方法是什么?
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 中看到了这种技术(优秀的项目!)。我需要访问外部提供程序类才能在茉莉花和其他地方进行注入 - 无济于事
angularjs - AngularJS:服务vs提供者vs工厂
AngularJS 中的Service
,Provider
和有什么区别?Factory
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?
rest - AngularJS 控制器/服务/http 通信
我已经将我的 REST API 封装在一个注入控制器的 AnguarJS 服务中。很标准,对。现在我希望该服务拦截任何 401 响应并以某种方式触发注销或重新登录提示或其他内容。问题是:该服务无权访问任何范围。广播该错误的最佳方法是什么?我提出了一些想法,但我是 Angular 的新手,想知道是否有人可以告诉我这样做的“Angular”方式?
1)我可以让服务充当我的 AppCtrl 可以监听的事件池。但这似乎有点过于复杂。所以:
2)我可以将 $rootScope 注入服务,并直接修改服务isLoggedIn
。但这似乎完全是错误的。我想明确区分服务服务数据、控制器控制范围以及指令与 dom 混在一起的地方。
3)我的每个控制器都可以监视一个被拒绝的承诺,如果原因是 401 错误,然后到达 $scope 并设置isLoggedIn
为 false,但这个选项显然很糟糕。
有什么帮助吗?
谢谢。
javascript - 从函数评估值时,$watch 似乎不起作用
我有一个渲染 gridBlocks 的中继器。这些块中的每一个都具有“Vote Good”、“Vote Bad”或“No vote” (出于我们的目的)的属性。除其他外,该属性控制块的 CSS 类。
用户投票的数据结构通过 访问userService
,它公开了更新投票、执行 ajax 调用等的方法。
我的问题是这样的:
我voteClass
通过调用userService
. 我想查看此属性并在其模型更改时相应地更新 UI。
但是,这似乎不起作用-即使值确实发生了变化,voteClass
也不会重新评估并且不会调用。$watch
getVoteClass(scope.block.id)
我试过使用$apply
,但这似乎并没有改变任何东西。
非常感谢您的意见...
Update1:我认为即使getVoteClass(scope.block.id)
更改的值,块范围属性也不会。有没有办法强制块范围重新评估其属性?
更新 2 - 问题已解决:在CaioToOn 和 Gloopy 的帮助下,我意识到错误在于范围属性引用了原始字符串这一事实。为了克服这个问题,您可以观察一个函数,或者使用对对象属性的直接引用(而不是原始字符串)。
控制器:
指示:
angularjs - Angularjs - 如何在服务中设置模块值?
我有一个 Angular 应用程序的以下服务模块。
用户登录后,login
服务返回一个唯一的会话 id,我想设置模块的uid
值以供其他服务调用参考。
我很确定上面的代码不起作用,因为我不能在模块的配置阶段使用值作为依赖项。如何在服务中设置uid
值login
并在模块内的其他服务中访问它,或者如果这不可能,我如何创建可以由这些服务设置/获取的值?
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 的答案。