所以我试图编写一个维护多级配置对象的服务。我希望能够在任何时间点设置和更改这些值。
在使用中,它的调用方式如下: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/