我已经看到angular.factory()和angular.service()用于声明服务; 但是,我在官方文档中找不到 angular.service任何地方.
这两种方法有什么区别?应该用什么(假设他们做不同的事情)?
我有服务,说:
factory('aService', ['$rootScope', '$resource', function ($rootScope, $resource) {
var service = {
foo: []
};
return service;
}]);
Run Code Online (Sandbox Code Playgroud)
我想foo用来控制用HTML呈现的列表:
<div ng-controller="FooCtrl">
<div ng-repeat="item in foo">{{ item }}</div>
</div>
Run Code Online (Sandbox Code Playgroud)
为了让控制器检测何时aService.foo更新,我将这个模式拼凑在一起,我将aService添加到控制器$scope,然后使用$scope.$watch():
function FooCtrl($scope, aService) {
$scope.aService = aService;
$scope.foo = aService.foo;
$scope.$watch('aService.foo', function (newVal, oldVal, scope) {
if(newVal) {
scope.foo = newVal;
}
});
}
Run Code Online (Sandbox Code Playgroud)
这感觉很长,我一直在每个使用服务变量的控制器中重复它.有没有更好的方法来完成观察共享变量?
我有一个显示我的产品的基本控制器,
App.controller('ProductCtrl',function($scope,$productFactory){
$productFactory.get().success(function(data){
$scope.products = data;
});
});
Run Code Online (Sandbox Code Playgroud)
在我看来,我在列表中显示这些产品
<ul>
<li ng-repeat="product as products">
{{product.name}}
</li>
</ul
Run Code Online (Sandbox Code Playgroud)
我想要做的是当有人点击产品名称时,我有另一个名为cart的视图,其中添加了此产品.
<ul class="cart">
<li>
//click one added here
</li>
<li>
//click two added here
</li>
</ul>
Run Code Online (Sandbox Code Playgroud)
所以我的疑问是,如何将这个点击的产品从第一个控制器传递到第二个?我认为购物车也应该是一个控制器.
我使用指令处理click事件.另外我觉得我应该使用服务来实现上述功能只是无法想象如何?因为购物车将是预定义的,所添加的产品数量可能是5/10,具体取决于用户所在的页面.所以我想保持这种通用性.
更新:
我创建了一个广播服务,在第二个控制器中我收到它.现在查询是如何更新dom的?由于我的产品列表是非常硬编码的.
是什么区别$parse,$interpolate和$compile服务?对我来说,他们都做同样的事情:拿模板并将其编译为模板函数.
在我的蜿蜒环绕世界各地的interweb,现在特别是angular.io风格的文档,我发现许多引用@HostBinding和@HostListener.看起来它们非常基础,但不幸的是,目前它们的文档有点粗略.
任何人都可以解释它们是什么,它们如何工作并举例说明它们的用法?
将"当前"传递$scope给AngularJS服务是否正确?
我正处于这样一种情况,我知道它仅由一个控制器消耗,并且我希望在$ service方法本身中引用控制器的范围.
这在哲学上是否正确?
或者我最好将事件广播到$ rootScope然后让我的控制器听取它们?
主要问题 - 有可能吗?我试着没有运气..
主app.js
...
var app = angular.module('myApp', ['services']);
app.config(['customProvider', function (customProvider) {
}]);
...
Run Code Online (Sandbox Code Playgroud)
提供者本身
var services = angular.module('services', []);
services.provider('custom', function ($http) {
});
Run Code Online (Sandbox Code Playgroud)
我有这样的错误:
Uncaught Error: Unknown provider: $http from services
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
谢谢!
在角度应用程序中,我们有ngOnDestroy()一个组件/指令的生命周期钩子,我们使用这个钩子取消订阅observables.
我想清除/ @injectable()服务中创建的destory observable .我看到一些帖子说ngOnDestroy()可以在服务中使用.
但是,这是一个很好的做法,只有这样才能这样做,什么时候会被召唤?有人请澄清一下.
在事件回调中更新模型时更新模型属性对视图没有影响,有什么想法可以解决这个问题吗?
这是我的服务:
angular.service('Channel', function() {
var channel = null;
return {
init: function(channelId, clientId) {
var that = this;
channel = new goog.appengine.Channel(channelId);
var socket = channel.open();
socket.onmessage = function(msg) {
var args = eval(msg.data);
that.publish(args[0], args[1]);
};
}
};
});
Run Code Online (Sandbox Code Playgroud)
publish() 功能是在控制器中动态添加的.
控制器:
App.Controllers.ParticipantsController = function($xhr, $channel) {
var self = this;
self.participants = [];
// here publish function is added to service
mediator.installTo($channel);
// subscribe was also added with publish
$channel.subscribe('+p', function(name) {
self.add(name);
});
self.add = function(name) …Run Code Online (Sandbox Code Playgroud) 有没有办法在模块配置后以编程方式将状态添加到$ stateProvider,例如服务?
要为这个问题添加更多上下文,我有一种情况可以采用两种方法:
国家定义
.state('index.resource.view', {
url: "/:resourceName/view?pageNumber&pageSize&orderBy&search",
templateUrl: "/resourceAdministration/views/view.html",
controller: "resourceViewCtrl",
reloadOnSearch: false,
})
Run Code Online (Sandbox Code Playgroud)
angular-services ×10
angularjs ×8
javascript ×5
angular ×2
data-binding ×2
observable ×1
rxjs ×1
watch ×1