1

我一直在尝试使用角度过滤器获取角度常量内嵌套常量的值。但是我找不到获取值的有效方法。我被允许使用 lodash "^2.4.1" 并且我尝试使用 _.pick 但我仍然只能访问根级别的常量而不是嵌套的常量。

//consider this
angular.module('myApp',[])

.constants('appConstants', {
    CONS1: 'root',
    CONS2: {
          NEST1: 'nested cons1',
          NEST2: 'nested cons2',
    }
)
.filter(getConstants, function  () {
    return function  (input) {
        var value =  appConstants[input];
        if (! value) {
            var keys = input.split('.');
            value =  appConstants;
            angular.forEach(keys, function(key, index) {
                value = value[key];
            });
        }
        return value;
    }
});

//where as
appConstants[CONS1]; //works
appConstants[CONS2.NEST1]; // return undefined
//in lodash
_.pick(appConstants, 'CONS2.NEST1'); // returns empty object
4

3 回答 3

2

使用 AngularJS 常量

AngularJS 常量就是它被定义的值(这里是一个对象)。

{
    CONS1: 'root',
    CONS2: {
          NEST1: 'nested cons1',
          NEST2: 'nested cons2',
    }
}

要获取NEST1,请使用通常的属性访问器、点表示法appConstants.CONS1.NEST1或方括号表示法appConstants["CONS1"]["NEST1"]


访问 HTML 模板中的常量

最简单的方法就是将常量对象添加到$rootScope.

angular.module('myApp', [])
    .constants('appConstants', {
        CONS1: 'root',
        CONS2: {
            NEST1: 'nested cons1',
            NEST2: 'nested cons2',
        }
    })
    .run(function($rootScope, appConstants) {
        $rootScope.CONSTANTS = appConstants;
    });

在任何模板中,只需CONSTANTS用作对象。

<span>{{ CONSTANTS.CONS2.NEST1 }}</span> 

来源:我可以在AngularJS下直接从HTML访问模块常量吗


使用 Lodash

如果您真的想使用 lodash,请使用启用复杂路径的_.get功能来解析到正确的嵌套对象。

_.get(appConstants, "CONS1.NEST1");

所以过滤器可以很简单:

.filter("const", function() {
    return function(input) {
        return _.get(appConstants, input);
    };
});

将字符串路径传递给过滤器以获取值。

{{ "CONS2.NEST1" | const }}

Lodash 的内置替代品

Amy Blankenship$parse在她的回答中介绍了 Angular,在我看来,在这种情况下,这是比 Lodash 更好的方法。


我不能使用_.get,因为我可以使用旧版本的lodash 2.4.1

有两种选择:

_.get是相当复杂的,但对于我们的简单情况,一个简单split的点上的字符串可能就可以了。

.filter("getConstants", function() {
    return function(input) {
        var obj = appConstants,
            path = input.split('.'),
            index = 0,
            length = path.length;

        while (obj != null && index < length) {
            obj = obj[path[index++]];
        }
        return obj;
    };
});
于 2017-02-16T15:15:05.370 回答
2

您还可以选择使用Angular$parse函数。我认为如果您将根常量对象作为上下文参数提供它,这将起作用。

这可能看起来像:

$parse(input)(appConstants)
于 2017-02-16T18:24:57.913 回答
0

您忘记了常量声明中的右大括号('}')。

也许试试这个:

.constants('appConstants', {
    CONS1: 'root',
    CONS2: {
          NEST1: 'nested cons1',
          NEST2: 'nested cons2',
    }
})
于 2017-02-16T15:25:55.833 回答