所以我正在尝试编写一个维护多级配置对象的服务。我希望能够在任何时间点设置和更改这些值。
在使用中,它将被称为: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;
};
这是关于我能做到的最冗长的事情,我尝试了其他几种更简洁的方法,但都没有奏效。嗯,这并不完全正确。所有这些都有效(包括这一个),但只有当一个值尚未存在时。如果该值已存在,则拒绝覆盖它。如果该值不存在,则将其按预期在正确的位置设置。
任何人都可以向我解释这个问题,还是我应该采取更好的方法?
答案 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);