AngularJS - 删除深层对象属性

6

我知道如何使用$parse服务设置对象的“深度”属性,就像在这篇文章中所述。

但是我该如何删除深层属性?不能使用以下方法将其分配为null

$parse('very.very.deep.property').assign($scope, null);

但实际上删除它,就像我们在JavaScript中所做的那样:

delete $scope.very.very.deep.property;

我很好奇为什么你不能使用 delete $scope.very.very.deep.property;,因为这会使 deep 成为空对象,而 hasOwnProperty('property') 为 false。 - charlietfl
@charlietfl 因为这部分:very.very.deep.property 是从服务器以字符串形式传递给我的。最终它会被转换成XML节点,并成为一个大的XML结构的一部分。 - Ivan Chernykh
好的...所以你必须递归循环遍历xml中的深层节点吗?如果是这样,在循环时可以在每个级别上继续添加[nodeName],然后添加[nodeName] [childNodeName]到范围中吗? - charlietfl
@charlietfl 是的,我猜很多解决方法都可以找到,但我非常有兴趣找到这个问题的真正解决方案 ;) - Ivan Chernykh
@charlietfl 数据块包含此字符串,通过一个服务器调用以其小视图的形式传入,例如:<script type="data">node='very.very.deep.property'</script><div><input/></div> - Ivan Chernykh
显示剩余2条评论
1个回答

5

很抱歉,目前并没有与您所寻找的功能对应的Angular服务/函数。但您仍可以实现类似如下代码来满足您的需求:

function Ctrl($scope,$parse){
  var path = 'very.very.deep.property';
  var partials = path.split('.');
  var deepKey = partials.pop(); //Extract the key name from your path
  var deepPath = partials.join('.'); //Build the parent's path
  var deep = $parse(deepPath);
  var prop = $parse(path);
  prop.assign($scope, "I'm so deep");
  delete deep($scope)[deepKey]; //Evaluate the deep path against your scope and delete the key
  console.log(deepKey, $scope.very.very.deep)
}

这里提供一个小工具链接,希望对你有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接