javascript - 通过服务与多级对象交互

标签 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;
};

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

任何人都可以向我解释一下这一点吗?或者他们是我应该采取的更好方法吗?

最佳答案

您是否考虑过使用$parse

Angular 已经通过 mustache 表示法解决了这个问题,例如: ng-model 可以设置 undefined object 的属性值。这是通过 $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);

关于javascript - 通过服务与多级对象交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28747448/

相关文章:

javascript - Angularjs单独进程执行

javascript - 如何使用 html5 canvas 扭曲图像以创建在风中飘扬的旗帜效果

javascript - 使用 javascript 读取文本框用户输入并插入超链接

javascript - 仅 div 内的动画

javascript - 使用 JavaScript 在 div 内使用鼠标事件绘制直线

angularjs - 我如何以 Angular 重新加载/重新启动服务?

javascript - AngularJS:链接功能中带有 D3 图表的指令仅工作一次

javascript - 如何使用jquery缩放相同质量的图像?

Java AngularJS Spring MVC - 将 bean 发送到 Controller 时 $http.post 400 bad request 语法不正确

angularjs - 使用 AngularJS 构建的计算器不显示结果