小编MJV*_*MJV的帖子

从同一服务调用AngularJS服务中的函数?

我有一个以下面的方式定义的AngularJS服务

angular.module('myService').service('myService', function() {
  this.publicFunction(param) {
    ...
  };

  this.anotherPublicFunction(param) {
    // how to call publicFunction(param)?
    ...
  };
});    
Run Code Online (Sandbox Code Playgroud)

我想从服务外部(工作正常myService.publicFunction(xxx))和同一服务中的另一个函数调用第一个函数,即anotherPublicFunction.既不是一个this.publicFunction(param)myService.publicFunction(param)将不会从第二个函数中工作,我可以理解.


编辑:
实际上整个问题是由你无法单独复制的东西引起的.我将第二个函数作为回调参数传递给另一个控制器中的另一个函数,当它被调用时,引用this不起作用.

例如

anotherService.someCall('a', 123, myService.anotherPublicFunction);
Run Code Online (Sandbox Code Playgroud)

内部失败,anotherPublicFunction因为this无法解决.

我写了一个Plunker来显示问题: http ://plnkr.co/edit/rrRs9xnZTNInDVdapiqF?p = info

(我仍然会留下这个问题以防万一.)


我知道我可以通过使用对服务的引用或类似的第一个函数来解决问题

var ms = this;
this.anotherPublicFunction(param) {
  ms.publicFunction(param);
  ...
};
Run Code Online (Sandbox Code Playgroud)

或这个

var pf = this.publicFunction;
this.anotherPublicFunction(param) {
  pf(param);
  ...
};
Run Code Online (Sandbox Code Playgroud)

但两者看起来都很脏.

在这种情况下,有没有一种好方法可以从第二个函数调用第一个函数?或者我首先要做一些完全错误的事情来获得这样的服务?

我发现这些问题的答案很好:

但它们与我的问题不同,因为其中一个有一个单独的内部函数被调用,另一个是使用工厂而不是服务.

编辑:

发布后我立即意识到我也可以这样做:

var actualWork = function(param) { …
Run Code Online (Sandbox Code Playgroud)

angularjs

75
推荐指数
4
解决办法
7万
查看次数

如何用$ scope.$ on对单元测试Angular控制器?

我的Angular应用程序中有一个带有事件监听器的控制器,定义如下.

  angular.module('test').controller('TestCtrl', function($rootScope, $scope, testService) {

    [...]

    $scope.$on("myEvent", function(args, value) {
      testService.doStuff(value);
    });
  });
Run Code Online (Sandbox Code Playgroud)

这在应用程序本身中完美运行.但是,当我尝试对控制器的功能进行单元测试时(使用JasmineKarma),每个测试方法都会抛出以下错误:

 TypeError: $scope.$on is not a function in [...]/testController.js
Run Code Online (Sandbox Code Playgroud)

我在我的测试方法中创建控制器如下.

  it('does stuff', inject(function($rootScope, $controller, testService) {
    var scope = $rootScope.$new;
    $controller('TestCtrl', {
      $scope : scope
    });

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

我可以通过改变我的控制器来解决这个问题rootScope:

  $rootScope.$on(...)
Run Code Online (Sandbox Code Playgroud)

但当然,应用程序不再按预期工作.我也可以通过$on在我的测试代码中引入该方法来消除错误:

  var scope = $rootScope.$new;
  scope.$on = function() {};
Run Code Online (Sandbox Code Playgroud)

但是像这样嘲笑听众会破坏测试我真实代码的目的.

为什么测试代码没有找到 $on 方法 scope(但发现它rootScope仍然......)

必须有一些我在这里缺少的基本功能,但即使经过大量的谷歌搜索和阅读Angular源代码,我也无法弄明白.

unit-testing jasmine angularjs karma-runner

13
推荐指数
1
解决办法
5367
查看次数

在 OpenAPI (Swagger) 中重用枚举的子集

我试图实现一个 OpenAPI 定义,其中我将允许值的共享、完整列表定义为枚举,然后在不同位置使用值的子组来显示每种情况下允许哪些值。

使用Swagger.io 上枚举规范的示例,如果我有这样的定义:

paths:
  /products:
    get:
      parameters:
      - in: query
        name: color
        required: true
        schema:
          $ref: '#/components/schemas/Color'
      responses:
        '200':
          description: OK
components:
  schemas:
    Color:
      type: string
      enum:
        - black
        - white
        - red
        - green
        - blue
Run Code Online (Sandbox Code Playgroud)

那么是否可以定义例如两个以颜色作为参数的不同路径,但其中一个仅接受blackwhite另一个接受所有颜色?

enums swagger openapi

8
推荐指数
1
解决办法
6354
查看次数

何时使用别名以及何时使用:请参阅Clojure/ClojureScript:require?

当使用:requireClojure中或ClojureScript,什么时候应该使用别名,当你你应该摘樱桃只有函数使用?

例子:

  1. 使用别名

    (:require [some-package.sub as some])
    
    (some/do-stuff "xyz")
    
    Run Code Online (Sandbox Code Playgroud)
  2. 运用 :refer

    (:require [some-package.sub :refer [do-stuff]])
    
    (do-stuff "xyz")
    
    Run Code Online (Sandbox Code Playgroud)

如果依赖项具有您想要使用的大量函数或者您使用其所有函数(无论有多少函数),则使用别名似乎更方便,特别是因为ClojureScript(故意)不支持:refer :all.另一方面,使用:refer似乎是一种更"干净"的方法,特别是在仅使用依赖项中的某些特定函数时.

在两者之间进行选择时是否应该考虑其他事项(这首先是一个有效的理由)?

我能想到的另一件事是,如果你在文件中定义了很多自己的函数的依赖关系和/或加载,那么在函数调用中使用别名前缀可以使这些函数的位置更加清晰,即使您只使用依赖项提供的一小部分函数.

我该如何选择使用哪一个?或者你应该在你的开发团队中做出决定,只要你坚持一种方法,一切都很好吗?

clojure clojurescript

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

Fish shell中是否有类似Zsh的路径替换?

我在OS X中尝试Fish shell,并且想知道是否存在与Zsh相同的路径替换功能,即

user@machine ~> % cd /usr/www/site1/current/log
user@machine /usr/www/site1/current/log
%> cd site1 site2
/usr/www/site2/current/log
user@machine /usr/www/site2/current/log
%>
Run Code Online (Sandbox Code Playgroud)

这个例子来自SlideShare,为什么Zsh比你的Shell更酷.

我在Fish中试过但它似乎不起作用,至少使用相同的语法.我也没有在Fish文档中找到任何"路径替换"的内容.

fish

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