如何将条件服务注入AngularJS 1 Controller

时间:2016-08-30 17:13:02

标签: javascript angularjs dependency-injection angularjs-injector

我有一个角度模块,设计为自包含。消费者应用程序可以使用url参数添加指令,并且在与窗口小部件交互时,它将使用该URL作为整体数据源。这有一个使用$ http加载数据的通用LoadService,并期望一个特定的JSON格式来运行该小部件。

现在我正在尝试重构,以便有人也可以创建自定义加载服务并将其注入模块,但如果没有注入,那么它将使用默认数据加载。所以我试图找出如何创建一种注入CustomLoadService的方法,如果它是由使用该模块的应用程序定义的。但是,如果未定义自定义服务,则不应该出错,它应该只使用默认服务。

我正在查看$injector.get,并认为这是一种可能性,但我无法将$injector注入控制器。我认为注入就像$location一样简单。有点像...

angular
  .module('Widget')
  .controller('WidgetController',[
    '$scope', 
    'WidgetLoadService', 
    '$injector', 
    WidgetController
  ]);

这种方法似乎不起作用,所以我想知道......解决这个问题的最佳“角度方式”是什么。我应该如何使用$ injector。

1 个答案:

答案 0 :(得分:0)

您可以使用$ injector:

import os

# path   : string to relative or absolute path to be queried
# subdirs: tuple or list containing all names of subfolders that need to be
#          present in the directory
def all_dirs_with_subdirs(path, subdirs):
    # make sure no relative paths are returned, can be omitted
    path = os.path.abspath(path)

    result = []
    for root, dirs, files in os.walk(path):
        if all(subdir in dirs for subdir in subdirs):
                result.append(root)
    return result

def get_directory_listing(path):
    output = {}
    output["text"] = path.decode('latin1')
    output["type"] = "directory"
    output["children"] = all_dirs_with_subdirs(path, ('Maps', 'Reports'))
    return output

with open('test.json', 'w+') as f:
    listing = get_directory_listing(".")
    json.dump(listing, f)

所以你可能有这样的结果:

app.controller('MainCtrl', function($scope, $injector) {
  $scope.name = $injector.get('test').name;
}).factory('test', function() { return {name: 'world'} });