通过服务与多级对象交互

时间:2015-02-26 16:19:11

标签: javascript angularjs

所以我正在尝试编写一个维护多级配置对象的服务。我希望能够在任何时间点设置和更改这些值。

在使用中,它将被称为:config.setValue(key, data)。一个例子可能是config.setValue("myConfigObject.myConfigAttribute", "myString")

在服务的另一端,有一个名为config的变量,它包含一个空白对象({})以启动,并设置了值。有一个setData函数可以使用新对象覆盖空白对象,这在我的应用程序启动早期发生,以提供一些初始值。

我服务中的setValue功能如下所示:

configService.setValue = function(key, data){
    // Create a set defer
    var setDefer = $q.defer();

    // If we have data, a key, and a valid config object
    if (data && key && config){

        // Set the value
        var tempObject = $.extend({}, config);
        var object = tempObject;

        // Loop over each of the keys
        for (var i=0, j=keys.length; i<j; i++){
            // If there is a valid object
            if (object[keys[i]]){

                // Move down in the config object
                object = object[keys[i]];
            } else {

                // Otherwise the value is not yet set, and we will set the value at this level
                object[keys[i]] = data;
                config = tempObject;
                setDefer.resolve();
            }
        }

        // Resolve the defer
        object = data;
        config = tempObject;
        setDefer.resolve();
    } else {
        // Reject the defer
        setDefer.reject();
    }

    return setDefer.promise;
};

这是关于我能做到的最冗长的事情,我尝试了其他几种更简洁的方法,但都没有奏效。嗯,这并不完全正确。所有这些都有效(包括这一个),但只有当一个值尚未存在时。如果该值已存在,则拒绝覆盖它。如果该值不存在,则将其按预期在正确的位置设置。

任何人都可以向我解释这个问题,还是我应该采取更好的方法?

1 个答案:

答案 0 :(得分:1)

您是否考虑过使用$parse

Angular必须用胡须符号来解决这个问题,例如: ng-model可以在未定义的对象上设置属性的值。这是通过$ parse完成的。

您应该可以执行类似

的操作
var getter = $parse(key);
var setter = getter.assign;
var context = rootConfigMap;// have a base object that has different config objects as children.
setter(context, newValue);