- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一项服务:
angular.module('cfd')
.service('StudentService', [ '$http',
function ($http) {
// get some data via the $http
var path = 'data/people/students.json';
var students = $http.get(path).then(function (resp) {
return resp.data;
});
//save method create a new student if not already exists
//else update the existing object
this.save = function (student) {
if (student.id == null) {
//if this is new student, add it in students array
$scope.students.push(student);
} else {
//for existing student, find this student using id
//and update it.
for (i in students) {
if (students[i].id == student.id) {
students[i] = student;
}
}
}
};
但是当我打电话save()
时,我无权访问 $scope
,并得到ReferenceError: $scope is not defined
。所以(对我来说)合乎逻辑的步骤是为 save() 提供 $scope
,因此我还必须将其提供/注入(inject)到 service
。所以如果我这样做:
.service('StudentService', [ '$http', '$scope',
function ($http, $scope) {
我收到以下错误:
Error: [$injector:unpr] Unknown provider: $scopeProvider <- $scope <- StudentService
错误中的链接(哇,太棒了!)让我知道它与注入(inject)器相关,并且可能与 js 文件的声明顺序有关。我尝试在 index.html
中重新排序它们,但我认为这是更简单的事情,比如我注入(inject)它们的方式。
使用 Angular-UI 和 Angular-UI-Router
最佳答案
您看到注入(inject)到 Controller 中的 $scope
不是某种服务(就像其他可注入(inject)的东西一样),而是一个 Scope 对象。可以创建许多范围对象(通常是从父范围继承的原型(prototype))。所有作用域的根是 $rootScope
,您可以使用任何作用域(包括 $rootScope)的
)。 $new()
方法创建新的子作用域
范围的目的是将应用程序的演示文稿和业务逻辑“粘合在一起”。将 $scope
传递到服务中没有多大意义。
服务是单例对象,用于(除其他外)共享数据(例如在多个 Controller 之间),并且通常封装可重用的代码片段(因为它们可以注入(inject)并在应用程序需要它们的任何部分提供“服务” : Controller 、指令、过滤器、其他服务等)。
我确信,多种方法都适合您。其一是这样的:
由于 StudentService
负责处理学生数据,因此您可以让 StudentService
保留一组学生,并让它与任何可能感兴趣的人“共享”(例如,您的$scope
)。如果有其他 View / Controller /过滤器/服务需要访问该信息(如果现在没有,如果它们很快就会开始出现,请不要感到惊讶),这更有意义。
每次添加新学生(使用服务的 save()
方法)时,服务自己的学生数组都会更新,共享该数组的所有其他对象也会自动更新。
根据上述方法,您的代码可能如下所示:
angular.
module('cfd', []).
factory('StudentService', ['$http', '$q', function ($http, $q) {
var path = 'data/people/students.json';
var students = [];
// In the real app, instead of just updating the students array
// (which will be probably already done from the controller)
// this method should send the student data to the server and
// wait for a response.
// This method returns a promise to emulate what would happen
// when actually communicating with the server.
var save = function (student) {
if (student.id === null) {
students.push(student);
} else {
for (var i = 0; i < students.length; i++) {
if (students[i].id === student.id) {
students[i] = student;
break;
}
}
}
return $q.resolve(student);
};
// Populate the students array with students from the server.
$http.get(path).then(function (response) {
response.data.forEach(function (student) {
students.push(student);
});
});
return {
students: students,
save: save
};
}]).
controller('someCtrl', ['$scope', 'StudentService',
function ($scope, StudentService) {
$scope.students = StudentService.students;
$scope.saveStudent = function (student) {
// Do some $scope-specific stuff...
// Do the actual saving using the StudentService.
// Once the operation is completed, the $scope's `students`
// array will be automatically updated, since it references
// the StudentService's `students` array.
StudentService.save(student).then(function () {
// Do some more $scope-specific stuff,
// e.g. show a notification.
}, function (err) {
// Handle the error.
});
};
}
]);
<小时/>
<子>使用此方法时应该小心的一件事是永远不要重新分配服务的数组,因为这样任何其他组件(例如作用域)仍将引用原始数组,并且您的应用程序将中断。
例如。清除 StudentService
中的数组:
/* DON'T DO THAT */
var clear = function () { students = []; }
/* DO THIS INSTEAD */
var clear = function () { students.splice(0, students.length); }
另请参阅此 short demo 。
<小时/>小更新:
几句话以避免在谈论使用服务但不使用 service()
函数创建服务时可能出现的困惑。
引用docs on $provide
:
An Angular service is a singleton object created by a service factory. These service factories are functions which, in turn, are created by a service provider. The service providers are constructor functions. When instantiated they must contain a property called
$get
, which holds the service factory function.
[...]
...the$provide
service has additional helper methods to register services without specifying a provider:
- provider(provider) - registers a service provider with the $injector
- constant(obj) - registers a value/object that can be accessed by providers and services.
- value(obj) - registers a value/object that can only be accessed by services, not providers.
- factory(fn) - registers a service factory function, fn, that will be wrapped in a service provider object, whose $get property will contain the given factory function.
- service(class) - registers a constructor function, class that will be wrapped in a service provider object, whose $get property will instantiate a new object using the given constructor function.
基本上,它所说的是每个 Angular 服务都是使用 $provide.provider()
注册的,但是对于更简单的服务有“快捷方式”方法(其中两个是 service( )
和 factory()
)。
这一切都“归结为”服务,因此使用哪种方法没有太大区别(只要该方法可以满足您的服务要求)。
顺便说一句,provider
vs service
vs factory
是 Angular 新手最容易混淆的概念之一,但幸运的是,有很多资源(此处为 SO)使事情变得更容易。 (只需四处搜索即可。)
(我希望能够解决这个问题 - 如果没有,请告诉我。)
关于angularjs - 将 $scope 注入(inject) angular.service 函数(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22898927/
我已阅读有关依赖注入(inject)的信息。然后来了 构造函数注入(inject), setter/getter 注入(inject) 二传手注入(inject) 接口(interface)注入(in
我正在研究依赖注入(inject)模式。我看过很多例子,其中一个典型的例子是使用 XxxService/XxxRepository 作为例子。但是在我看来,按照UML的概念,类XxxRepositor
我开始使用 Google Guice。 我有一个简单的问题: javax.inject 的 @Inject 注释和 com.google.inject 的 有什么区别@Inject 一个 ? 谢谢。
当使用构造函数注入(inject)工厂方法时,依赖的属性不会得到解析。但是,如果在解析依赖的组件之前解析了工厂方法,则一切都会按预期工作。此外,当仅使用属性注入(inject)或构造函数注入(inje
我有这样的事情: class Root { public Root(IDependency dep) {} } class Dependency:IDependency { p
听完Clean Code Talks ,我开始明白我们应该使用工厂来组合对象。因此,例如,如果 House有一个 Door和 Door有一个 DoorKnob , 在 HouseFactory我们创建
情况:我需要在一些 FooClass 中进行惰性依赖实例化,所以我通过 Injector类作为构造函数参数。 private final Injector m_injector; public Foo
在编写代码时,我们应该能够识别两大类对象: 注入(inject)剂 新品 http://www.loosecouplings.com/2011/01/how-to-write-testable-cod
这个问题是关于 Unity Container 的,但我想它适用于任何依赖容器。 我有两个具有循环依赖关系的类: class FirstClass { [Dependency] pub
如果我有 10 个依赖项我需要注入(inject)并且不想在构造函数中有 10 个参数,我应该使用哪种注入(inject)模式? public class SomeClass { privat
我在使用 Angular2 DI 时遇到了问题。我尝试将一个类注入(inject)另一个类,它引发了以下错误: 留言:"Cannot resolve all parameters for 'Produ
对依赖注入(inject)还很陌生,我想弄清楚这是否是一种反模式。 假设我有 3 个程序集: Foo.Shared - this has all the interfaces Foo.Users -
我正在尝试了解 Angular 14 的变化,尤其是 inject()我可以将模块注入(inject)功能的功能,我不需要为此创建特殊服务..但我想我弄错了。 我正在尝试创建一些静态函数来使用包 ng
希望这个问题不是太愚蠢,我试图掌握更高级的编程原理,因此试图习惯使用 Ninject 进行依赖注入(inject)。 因此,我的模型分为几个不同的 .dll 项目。一个项目定义了模型规范(接口(int
我最近一直在大量使用依赖注入(inject)、测试驱动开发和单元测试,并且开始喜欢上它。 我在类中使用构造函数依赖,这样我就可以为单元测试注入(inject)模拟依赖。 但是,当您实际需要生产环境中的
我有下面的代码来使用 Guice 进行依赖注入(inject)。第一个是使用构造函数注入(inject),而另一个是直接在字段上方添加 @Inject。这两种方式有什么区别吗? Guice官网似乎推荐
这个问题在这里已经有了答案: Angular2 Beta dependency injection (3 个答案) 关闭 7 年前。 我正在使用 angular2 测试版。并在使用 @Inject
有没有可能做这样的事情? (因为我尝试过,但没有成功): @Injectable() class A { constructor(private http: Http){ // <-- Injec
我很恼火必须通过 Constructor 传递管道对象,因为我想为业务实体或要传递的值保留构造函数参数。 所以我想通过 setter ,但只要这些 setter 没有被填充,我的包含依赖项的对象就不应
假设我有这个: SomePage.razor: @inject Something something @page "/somepage" My Page @code { // Using
我是一名优秀的程序员,十分优秀!