标签: angularjs-service

使用TypeScript在AngularJS服务中进行依赖项注入的最佳实践

我发现在TypeScript中对AngularJS服务的依赖注入有些麻烦.目前,我在服务类中定义了一个工厂方法,并且必须重复三次依赖注入参数:

class MyService {
    public static Factory($rootScope, myController) {       // 1st time
        return new MyService($rootScope, myController);     // 2nd time
    }
    constructor(public $rootScope, public myController) {}  // 3rd time
}
myModule.factory('myService', MyService.Factory);
Run Code Online (Sandbox Code Playgroud)

我想做以下,但这似乎不起作用:

class MyService {
    constructor(public $rootScope, public myController) {}  // only once
}
myModule.factory('myService', MyService);
Run Code Online (Sandbox Code Playgroud)

这种方法适用于控制器,但对于服务则不然.有没有更好的办法?

提前致谢!

angularjs typescript angularjs-service

7
推荐指数
2
解决办法
2504
查看次数

Angularjs范围之外的服务功能

我在angularJS中创建了一个服务,它使用btford.socket-io模块与服务器进行交互.因为在服务中我实现了一些我目前在angular内部使用的API,但是为了以后扩展应用程序,我还需要在角度范围之外访问这些API.因此,将来可以在不需要创建控制器和其他东西的情况下调用该函数.

目前我为控制器做了这个

var myController = angular.element($('body')).scope().myController;
Run Code Online (Sandbox Code Playgroud)

将整个控制器保存在范围变量中.我想知道是否可以对服务做同样的事情.

javascript socket.io angularjs angularjs-service angularjs-controller

7
推荐指数
1
解决办法
3385
查看次数

如何将自定义方法添加到restangular服务?

我有一个解耦的Restangular服务,我想附加一个自定义方法.看来,唯一的方法,在默认情况下收集回来的getList,onepost.我想要做Locations.getLongLat()

我已经尝试将以下内容添加到我的服务中,但没有运气(该方法没有绑定到对象),我只是undefined is not an object回应了.

angular.module('myApp')
.factory('Locations', function (Restangular) {

    return Restangular.withConfig(function (RestangularConfigurer) {
        RestangularConfigurer.addElementTransformer('api/v1/locations', true, function (location) {
            location.addRestangularMethod('getLongLat', 'get', 'longlat');
            return location;
        });
    }).service('api/v1/locations');
})
Run Code Online (Sandbox Code Playgroud)

有人有主意吗?

angularjs angularjs-service restangular

7
推荐指数
1
解决办法
1772
查看次数

我可以直接在templateUrl上使用Angular服务中的$ compile而不是原始HTML或原始angular.element吗?

给定以下用于创建"对话框"元素(即模态)的服务:

app.service('dialog', ['$document', '$compile', '$rootScope',
    function($document, $compile, $rootScope) {

        var body = $document.find('body');
        var scope = $rootScope.$new();

        this.createDialog = function() {
            var dialogElem = angular.element('<div ng-include="\'/dialog.html\'"></div>');
            $compile(dialogElem)(scope);
            body.append(dialogElem);
        };

    }
]);
Run Code Online (Sandbox Code Playgroud)

可以在控制器中使用,如下所示:

$scope.someFunction = function() {
    dialog.createDialog();
};
Run Code Online (Sandbox Code Playgroud)

有没有办法可以使用$compile或其他任何东西在我的服务中没有HTML?我真的更喜欢只调用一个指令,这样运行createDialog()立即将指令注入我的DOM,因此该指令负责将新控制器和模板链接在一起.如果我以错误的方式解决这个问题,我对建设性的想法完全开放.

angularjs angularjs-service

7
推荐指数
1
解决办法
3858
查看次数

AngularJS:服务查询返回零结果

我的app.js样子

var app = angular.module('pennytracker', [
  '$strap.directives',
  'ngCookies',
  'categoryServices'
]);

app.config(function($routeProvider) {
  console.log('configuring routes');
  $routeProvider
    .when('/summary', { templateUrl: '../static/partials/summary.html'})
    .when('/transactions', { templateUrl: '../static/partials/transaction.html', controller: 'AddTransactionController' })
});
Run Code Online (Sandbox Code Playgroud)

而我的app/js/services/categories.js样子

angular.module('categoryServices', ['ngResource']).
  factory('Category', function($resource){
    return $resource(
      '/categories/:categoryId',
      {categoryId: '@uuid'}
    );
  });
Run Code Online (Sandbox Code Playgroud)

我有一条路线

  .when('/transactions', { templateUrl: '../static/partials/transaction.html', controller: 'AddTransactionController' })
Run Code Online (Sandbox Code Playgroud)

我的控制器app/js/controllers/transactionController.js看起来像

function AddTransactionController($scope, $http, $cookieStore, Category) {
 // some work here
  $scope.category = Category.query();
  console.log('all categories - ', $scope.category.length);
}
Run Code Online (Sandbox Code Playgroud)

当我运行我的应用程序时,我看到console.log为

all categories -  0 
Run Code Online (Sandbox Code Playgroud)

我在这做错了什么?

javascript angularjs angularjs-service angularjs-scope angularjs-routing

6
推荐指数
1
解决办法
4931
查看次数

角度服务定义:服务或工厂

我是一个有角度的新手,我正在构建一个应用程序,有一件事让我感到困惑的是有几种方法可以定义服务,而且我从这个链接中读到更多:如何定义服务 然后它似乎没有大的区别定义服务的方式.

但我刚才注意到一个与众不同的区别:

看到我从这里得到的这项服务http://jsfiddle.net/2by3X/5/

var app = angular.module('myApp', []);
app.service('test', function($timeout, $q) {
  var self = this;
  this.getSomething = function() {
    return self.getData().then(function(data) {
      return self.compactData(data);
    });
  };
  this.getData = function() {
    var deferred = $q.defer();

      $timeout(function() {
          deferred.resolve("foo");
      }, 2000);
    return deferred.promise;
  };
  this.compactData = function(data) {
    var deferred = $q.defer();

    console.log(data);

    $timeout(function() {
        deferred.resolve("bar");
    }, 2000);
    return deferred.promise;
  };
});
Run Code Online (Sandbox Code Playgroud)

如果我使用"factory"定义此服务,如下所示,一个函数不能调用该服务的其他功能.

app.factory('test', function($timeout, $q) {
  return {
      getSomething : function() {
    return getData().then(function(data) {
      return compactData(data); …
Run Code Online (Sandbox Code Playgroud)

angularjs angularjs-service

6
推荐指数
1
解决办法
1253
查看次数

AngularJS - 深层对象'属性删除

我知道如何使用$parse服务设置对象'"deep"属性,就像在这篇文章中一样.

但是我如何删除深层财产?不要将其分配给null:

$parse('very.very.deep.property').assign($scope, null);
Run Code Online (Sandbox Code Playgroud)

,但实际上删除它,就像我们在JavaScript中这样做:

delete $scope.very.very.deep.property;
Run Code Online (Sandbox Code Playgroud)

javascript object angularjs angularjs-service angularjs-scope

6
推荐指数
1
解决办法
4321
查看次数

何时重新初始化AngularJS服务?

angularjs中服务(或工厂)的生命周期是什么?何时重新初始化?

angularjs angularjs-service angularjs-controller

6
推荐指数
2
解决办法
2172
查看次数

$ http请求的后台处理通知

我正在寻找一种"包装"所有$http请求的方法,这样我可以gif在应用程序进行某些处理时显示图像.我也希望将相同的解决方案用于其他类型的后台处理而不仅仅是$http.

为什么我问的原因是我总要为我设置processingIndicatortrue,然后我切换回success函数,而不是优雅的.

我看到的一个可能的解决方案是使用一个函数将函数作为参数.此函数将设置processingIndicatortrue,调用该函数,然后设置processingIndicator回"false".

function processAjaxRequestSuccessFn(fooFn){
  // display processing indicator
  fooFn();
  // hide processing indicator
}
Run Code Online (Sandbox Code Playgroud)

然后

$http.get(...).then(processAjaxRequestSuccessFn, processAjaxRequestErrorFn)
Run Code Online (Sandbox Code Playgroud)

这个解决方案不是很方便,因为每次我需要通知用户发生了什么事情时,我需要使用这个功能.

我正在寻找一种自动化这个过程的方法.

还有其他想法吗?

稍后编辑

另一个想法我是延长$http我自己的get,post等等,或者创建具有类似行为的自定义服务.但仍然不是很优雅.

javascript ajax angularjs angularjs-service

6
推荐指数
1
解决办法
411
查看次数

如何从浏览器控制台访问和测试AngularJS过滤器?

给定一个测试过滤器,假设这个'大写'过滤器将大写每个单词的第一个字母:

return function (input) {
  return (!!input) ? input.replace(/([^\W_]+[^\s-]*) */g, function (txt) {
    return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
  }) : '';
}
Run Code Online (Sandbox Code Playgroud)

如何从浏览器的JavaScript控制台测试此过滤器?

angularjs angularjs-service angularjs-filter

6
推荐指数
1
解决办法
2029
查看次数