标签: angularjs-service

服务应该暴露他们的异步性吗?

我正在编写一个将异步检索数据的服务($ http或$ resource).我可以通过返回一个最初为空的数组来隐藏它是异步的这一事实,但最终会被填充:

.factory('NewsfeedService1', ['$http', function($http) {
   var posts = [];
   var server_queried = false;
   return {
      posts: function() {
         if(!server_queried) {
            $http.get('json1.txt').success(
              function(data) {
                server_queried = true;
                angular.copy(data, posts);
            });
         }
         return posts;
      }
   };
}])
.controller('Ctrl1', ['$scope','NewsfeedService1',
function($scope, NewsfeedService1) {
    $scope.posts = NewsfeedService1.posts();
}])
Run Code Online (Sandbox Code Playgroud)

或者我可以通过回复承诺来暴露异步性:

.factory('NewsfeedService2', ['$http', function($http) {
  var posts = [];
  var server_queried = false;
  var promise;
  return {
     posts_async: function() {
       if(!promise || !server_queried) {
         promise = $http.get('json2.txt').then(
           function(response) {
              server_queried = true;
              posts = …
Run Code Online (Sandbox Code Playgroud)

angularjs angularjs-service

18
推荐指数
3
解决办法
3311
查看次数

angularjs中`value`属性和`ng-value`属性有什么区别

angularjs模板valueng-value属性之间有什么区别?如果我ng-if在使用value属性的字段上使用它可以正常工作但如果我将属性更改valueng-value它停止工作.

example 1  // it works 

<input type='radio' ng-model='difficulty' value='hard'/>
<div ng-if="difficulty == 'hard'">
     <p>difficulty is hard</p>
</div>  

Example 2 // it doesn't work

<input type='radio' ng-model='level' ng-value='hard'/>
<div ng-if= "level == 'hard'" >
     <p>level is hard</p>
</div>
Run Code Online (Sandbox Code Playgroud)

javascript angularjs angularjs-service angularjs-scope angularjs-ng-repeat

17
推荐指数
1
解决办法
2万
查看次数

在angularjs拦截器中停止请求

如何在Angularjs拦截器中停止请求.

有没有办法做到这一点?

我尝试使用promises并发送拒绝而不是解决!

.factory('connectionInterceptor', ['$q', '$timeout',
   function($q, $timeout) {
    var connectionInterceptor = {
        request: function(config) {
            var q = $q.defer();
            $timeout(function() {
                q.reject();
            }, 2000)
            return q.promise;
            // return config;
        }
    }
    return connectionInterceptor;
  }
])
.config(function($httpProvider) {
   $httpProvider.interceptors.push('connectionInterceptor');
});
Run Code Online (Sandbox Code Playgroud)

angularjs angularjs-service angular-promise

17
推荐指数
3
解决办法
1万
查看次数

这是"延期反模式"吗?

我发现很难理解"延迟反模式".我认为我原则上理解它,但我没有看到一个超级简单的例子,一个服务,一个不同的承诺和一个反模式,所以我想我会尝试自己做但看到我不是超级了解它我先得到一些澄清.

我在工厂(SomeFactory)中有以下内容:

//url = 'data.json';

return {
    getData: function(){
        var deferred = $q.defer();

        $http.get(destinationFactory.url)
            .then(function (response) {

                if (typeof response.data === 'object') {
                    deferred.resolve(response.data);
                } else {
                    return deferred.reject(response.data);
                }
            })

            .catch(function (error) {
            deferred.reject(error);
        });

        return deferred.promise;
    }
Run Code Online (Sandbox Code Playgroud)

我检查它的对象的原因只是在上面添加一个简单的验证层 $http.get()

以下,在我的指令中:

this.var = SomeFactory.getData()
    .then(function(response) {
        //some variable = response;
    })
    .catch(function(response) {
        //Do error handling here
});
Run Code Online (Sandbox Code Playgroud)

现在我的理解是,这是一个反模式.因为原始的延期承诺会捕获错误并简单地吞下它.它不会返回错误,因此当调用此"getData"方法时,我已经执行了另一个捕获错误的捕获.

如果这不是反模式,那么有人可以解释为什么两者都要求各种"回调"吗?当我第一次开始写这个工厂/指令时,我预计不得不在某个地方做一个默认的承诺,但我没有预料到必须.catch()在两边(也就是我有点想我可以让工厂返回响应或错误,如果我做了一个SomeFactory.getData()

angularjs angularjs-directive angularjs-service angular-promise

17
推荐指数
2
解决办法
2826
查看次数

如何在AngularJS中"急切加载"服务?(在需要之前自动实例化)

我正在尝试实现这样的程序结构:

在此输入图像描述

这里的问题是,当开头没有明显的控制器使用功能时,它们没有实例化而没有注册FeatureRegistry,因此它们无法显示在视图中.但我想要实现的是它们出现在视图中,然后通过模板加载ng-include,然后在模板中有每个特性的特定控制器.这些控制器是使用功能的控制器.

这些功能基本上只用于说明要使用的模板和图标的位置,以及启动功能的开始.

但回到我最初的问题:
即使现在不需要服务,如何实例化服务呢?

或者是否有其他功能,我可以使用它而不是服务?我还想如果你指出我那么:)

lazy-loading lazy-initialization angularjs angularjs-service

16
推荐指数
2
解决办法
6526
查看次数

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

我有一个简单的服务,我试图进行单元测试.无论我尝试什么,searchService都是未知的提供者,或者服务是null(奇怪的是,这不会导致我的测试失败!!).

任何人都可以了解我可能做错了什么?

angular.module('app').service('searchService', function( $q, _ ) { // _ is lodash

  var cache = [
    {
      id: "current",
      name: "Current",
      description: "Search current data"
    },
    {
      id: "historical",
      name: "Historical",
      description: "Search historical data"
    }
  ];

  this.getSearchOptions = function() {
    var deferred = $q.defer();
    deferred.resolve( angular.copy( cache ) );
    return( deferred.promise );
  };

  this.getSearchOptionsByID = function( id ) {
    var deferred = $q.defer();
    var searchOption = _.findWithProperty( cache, "id", id );

    if ( searchOption ) {
      deferred.resolve( angular.copy( searchOption …
Run Code Online (Sandbox Code Playgroud)

jasmine angularjs angularjs-service karma-runner

16
推荐指数
1
解决办法
3万
查看次数

AngularJS:如何将值从Controller传递到Service Method?

我有一个依赖于a的控制器TransactionService.其中一种方法是

$scope.thisMonthTransactions = function () {
    $scope.resetTransactions();
    var today = new Date();
    $scope.month = (today.getMonth() + 1).toString();
    $scope.year = today.getFullYear().toString();
    $scope.transactions = Transaction.getForMonthAndYear();
};
Run Code Online (Sandbox Code Playgroud)

TransactionService模样

angular.module('transactionServices', ['ngResource']).factory('Transaction', function ($resource, $rootScope) {
    return $resource('/users/:userId/transactions/:transactionId',
        // todo: default user for now, change it
        {userId: 'bd675d42-aa9b-11e2-9d27-b88d1205c810', transactionId: '@uuid'},
        {
            getRecent: {method: 'GET', params: {recent: true}, isArray: true},
            getForMonthAndYear: {method: 'GET', params: {month: 5, year: 2013}, isArray: true}
        });
});
Run Code Online (Sandbox Code Playgroud)

正如你所看到的方法getForMonthAndYear取决于两个参数monthyear,现在正好是硬编码params: {month: 5, …

javascript angularjs angularjs-service angularjs-scope

16
推荐指数
2
解决办法
3万
查看次数

无法从$ injector.get()获取服务实例

我定义了一个名为"greeting"的客户服务,但无法从$ injector.get('greeting')获取实例.它会抛出这样的错误:未知提供者:greetingProvider < - 问候语.那么这是获得它的正确方法?以下是代码:

var app = angular.module('myDI', []);
app.config(function($provide){
    $provide.provider('greeting', function(){
        this.$get = function(){
             return function(name) {
                 console.log("Hello, " + name);
            };
        };
    });
});

var injector = angular.injector();
var greeting = injector.get('greeting');
greeting('Ford Prefect');
Run Code Online (Sandbox Code Playgroud)

angularjs angularjs-service

15
推荐指数
1
解决办法
3万
查看次数

当promise被拒绝时,AngularJS服务重试

我从我的控制器中的异步服务获取数据,如下所示:

myApp.controller('myController', ['$scope', 'AsyncService',
function($scope, AsyncService) {
    $scope.getData = function(query) {
        return AsyncService.query(query).then(function(response) {
            // Got success response, return promise
            return response;
        }, function(reason) {
            // Got error, query again in one second
            // ???
        });
    }
}]);
Run Code Online (Sandbox Code Playgroud)

我的问题:

  1. 如何在没有返回承诺的情况下从服务中收到错误时再次查询服务.
  2. 在我的服务中这样做会更好吗?

谢谢!

javascript angularjs angularjs-service

15
推荐指数
2
解决办法
2万
查看次数

当范围更改时,AngularJS不更新模板变量

这将是专家们非常明显的愚蠢问题之一.

我有一个websocket将数据推送到服务,我正在尝试存储数据并通过我的控制器将其推送到模板.

数据进入并更新变量但仅UI更新是我对该数据执行操作:

services.factory('Summary', ['$q','$rootScope','$http', '$location', function ($q, $rootScope,$http, $location) {

var Service = {};
Service.dataObj = {};
Service.dataObj.d = {"gello":"goodbye"};
....
function listener(data) {
   messageObj = data;
    Service.dataObj.d = data;
  console.log("Received data from websocket: ", messageObj);

}
})]);


controllers.controller('UserCtrl', ['$scope', 'Summary',
function ($scope, Summary) {

    $scope.click = function(){
        alert(JSON.stringify($scope.summaryinfo));
    }
    $scope.summaryinfo = [Summary.dataObj];
    $scope.summarygridOptions = {
        data: 'summaryinfo'
    };
    console.log("hello");
}]);
Run Code Online (Sandbox Code Playgroud)

数据被吸入并据我所知,因为它存储在Service.dataObj.d中,如果我在Service.dataObj指向我的HTML模板,那个对象正在被更新而不被替换,所以指针应该保留并且对象被监视.

但除非我运行click()方法,否则它不会改变,在这种情况下,即使我只是触发警报,UI也会受到影响.

我错过了什么?

javascript angularjs angularjs-service angularjs-scope

15
推荐指数
1
解决办法
1万
查看次数