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

时间:2015-02-21 15:00:08

标签: javascript c# asp.net-mvc angularjs

我觉得我一直在搞清楚我的mvc.NET / angularjs项目的解决方案。

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

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

这是控制器

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

这项工作看起来效果很好,但最近我一直在努力研究与subnav相关的项目。有一节我基本上是暴力强迫它(因为它不是这样的服务)在这种情况下,我正在建立一个工厂:

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。

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

由于

1 个答案:

答案 0 :(得分:0)

在考虑了一段时间之后,我将使用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();
            }
        };
    }
]);