如何在没有拼接的情况下更新数组(angularjs)元素?

时间:2015-06-29 14:35:01

标签: javascript arrays json angularjs

我遇到的情况就像在这篇文章中here一样,我不仅需要获取元素,还要更改它的元素。名称值。

我已经发现可以这样做:

dataList.splice(index, 1);
dataList.splice(index, 0, newItem);

但是有几个问题。我知道id,但是如果我不时地操纵数组,我会松开索引的跟踪< => id相关因为使用这种方法我将取出项目,更改它们并将它们作为一个" new"一个,对吗?但这有点不太优雅,可能会引起我认为的问题。

基本上我只是想切换一个可见的属性,然后应该在数组中改变。这是数组:

$scope.cLines = [{ id: 1, cColor: 'red', cName: 'Entryline right', visible: true }];

当然里面通常有更多元素,但出于简单原因我留下了一个元素。

可见的切换器应该像那样工作(naiv"伪代码"如果它能像那么简单就行,真的很棒:))

$scope.cLines[id === id].visible = !$scope.cLines[id === id].visible;

如果我可以直接使用过滤器访问元素,那么第二个最好的事情就是这样吗?

提前谢谢。

2 个答案:

答案 0 :(得分:2)

有几种方法可以解决这个问题。一种是使用filter()

var id = 1;
var visibility = true;

var items = $scope.cLines.filter(function(item) {
    return item.id === id;
});
if (items.length >= 1) items[0].visible = visibility;

你可以把它包装成一个函数:

function setVisibility(arr, id, visibility) {
    var items = arr.filter(function(item) {
        return item.id === id;
    });
    if (items.length >= 1) items[0].visible = visibility;
}

然后像这样使用它:

setVisibility($scope.cLines, 1, true);

您还可以将$scope.cLines更新为更复杂的对象,而不仅仅是数组:

$scope.cLines = {
    "item" : function (id) {
        var items = this.lines.filter(function(item) {
            return item.id === id;
        });
        if (items.length >= 1) 
            return items[0];
        else
            return new Object(); //or throw an error
    },
    "lines" : [
        { id: 1, cColor: 'red', cName: 'Entryline right', visible: true }
        //....and more
    ]
};

然后像这样使用它:

$scope.cLines.item(1).visible = true;

使用此功能,如果必须循环使用,请务必使用$scope.cLines.lines

答案 1 :(得分:0)

我不确定我是否完全理解这个问题,所以如果我离开这里,也许你可以澄清你想要做什么。

如果你有一个ng-repeat并且你试图在当前对象中切换一些值,只需将该对象传递给ng-click函数:

<button ng-click="changeVisible(line);" ng-repeat="line in cLines">Visible = {{line.visible}}</button>

然后在你的控制器中,你会有这样的事情:

$scope.changeVisible = function(obj) {
    obj.visible = !obj.visible;
  }

var app = angular.module('demo', []);

app.controller('DemoCtrl', function($scope) {
  $scope.cLines = [{
    id: 1,
    cColor: 'red',
    cName: 'Entryline right',
    visible: true
  }, {
    id: 2,
    cColor: 'blue',
    cName: 'Entryline right',
    visible: false
  }];

  $scope.changeVisible = function(obj) {
    obj.visible = !obj.visible;
  }

});
<script src="https://code.angularjs.org/1.3.16/angular.js"></script>
<div ng-app="demo">
  <div ng-controller="DemoCtrl">
    <button ng-click="changeVisible(line);" ng-repeat="line in cLines">Visible = {{line.visible}}</button>
  </div>
</div>