需要将服务/工厂存储为一个值

need to store a service/factory as a value

本文关键字:一个 存储 服务 工厂      更新时间:2024-03-23

我觉得我一直在想我的mvc的解决方案。NET/angularjs项目。

目前,我觉得我做得很好,将视图抽象为使用控制器,该控制器是controller.cs特定类的类型名称,例如:

<body ng-controller="@Model.ControllerType.Name">
...
</body>

这是控制器

superSiteApp.controller("MediaController", ["$scope", "$window", "SubNavFactory", function ($scope, $window, SubNavFactory) {
         ...
});

这项工作似乎做得很好,但最近我一直在努力处理与sub-v相关的项目。在一个部分中,我基本上是强行使用它(因为它不是这样的服务)。在这种情况下,我正在建立一个工厂:

var superSiteApp = angular.module('superSiteApp', []);
superSiteApp.factory("SubNavFactory", ["subNavCollectionWrapper", function (subNavCollectionWrapper) {
    return {
        get: function() {
            return subNavCollectionWrapper.get();
        }
    };
}]);

后来我把它推到这里,就像这样:

@section AdditionalHeaderLinks
{
    <script language="javascript" type="text/javascript">
        superSiteApp.value("subNavCollectionWrapper", {
            get: function() {
                return @Html.Raw(Json.Encode(Model.Menus[1].Links));
            }
        });
    </script>
}   

这部分工作得很好,但现在我需要做一个调用api的部分。

所以这个想法有点像:

superSiteApp.service("SubNavFactoryUri", ["$http", "uri", function ($http, uri){
    return $http.get(uri);
}]);

这就是我迷路的地方。在我的新View.chtml文件中,我不知道如何使该连接正常工作。

@section AdditionalHeaderLinks
{
    <script language="javascript" type="text/javascript">
        superSiteApp.value("subNavCollectionWrapper",  /* this is my struggle */);
    </script>
} 

我不知道如何引用服务来传递它。是的,我可以自己创建一个函数类,但我想我应该利用angularjs。

也许这里的方法不正确,因为这是我唯一能想到的事情。如有任何建议,我们将不胜感激。

感谢

经过一段时间的思考,我将事情从使用value()方法改为提供工厂。有几件事我需要解决,但我越是把它分解,它就越有意义。

现在的想法是:

// same as before, this is for hard coded elements
superSiteApp.factory("SubNavFactory", ["subNavCollectionWrapper", function(subNavCollectionWrapper) {
    return {
        "get": function () {
            return subNavCollectionWrapper.get();
        }
    };
}]);
// This is the idea from above
superSiteApp.service("SubNavServiceUri", ["$http", function($http) {
    return { 
        get: function(uri) { 
            return $http.get(uri); 
        }
    };
}]);

// now we put them together. I'll use the get(action) method to call the item
superSiteApp.factory("SubNavFactories", ["SubNavFactory", "SubNavServiceUri", function(SubNavFactory, SubNavServiceUri) {
        return {
            "ActionName1": {
                "get": function () {
                    return SubNavServiceUri.get("/the/rest/api");
                }
            },
            "ActionName1": SubNavFactory,
            "get" : function(action) {
                return this[action].get();
            }
        };
    }
]);