如何:Angular 在 JavaScript 对象中声明的工厂方法?

HOW TO: Angular Factory method declared in a JavaScript object?

我有一些这样的代码:

(function() {
    'use strict';

    angular.module('outApp.core')
        .factory('socket', socketDataService);

    function socketDataService() {

        var service = {
            openSocket: openSocket,
            closeSocket: closeSocket,
            getUpdates: getUpdates,
            sendUpdates: sendUpdates,
        };

        return service;

        function openSocket() {
            var contextPath = document.location.href.split('/#')[0];
            var sock = new SockJS(contextPath + '/api/cart');
            var stompClient = Stomp.over(sock);

            stompClient.connect({}, function(frame) {
                console.log('Connected ' + frame);
                stompClient.subscribe("/app/cart", {}, { customerId: "4654654", cartId: "54654" });
            });
        }

还有其他命名函数,如开头名为 service 的 JS 对象所示,但为了简洁起见,我将它们排除在外。

我正在尝试使用工厂构造函数授予对我在 service 对象中提到的函数的访问权限,该构造函数应该是可注入的,因此可以在我们的整个应用程序中访问。

我有两个问题:这是定义和 return 方法的正确方法吗?

我知道我可以定义:

var service.method = function () {
     //do stuff
}
var service.anothermethod = function () {
     // do other stuff
}
return service;

但为了清晰、可读性和风格,我们选择这样做。我看到另一位开发人员以第一种方式这样做,但我不清楚发生了什么。

下一个问题:如何在函数中访问并测试这些方法?我在工厂的末尾设置了一个 debugger,但我无法在控制台中看到这些方法。

谢谢!

这样做:

function foo() {
    bar();

    function bar () {
        [...]
    }
}

基本上和这样做是一样的:

function foo() {
    var bar = function () {
        [...]
    };

    bar();
}

函数只是一种类型的对象,您可以将其赋值、作为参数传递给其他函数等。不要将 is 视为 Java 中的方法。

你说的2种方式都可以。虽然第二种方式没有"var":

service.method = function () {
    //do stuff
};

您只是设置对象的 属性,就像设置 int 一样:

service.foo = 42;

除此之外,我不确定你在问什么。