动态添加数据到JSON

时间:2016-03-29 10:18:53

标签: javascript angularjs json

所以我要做的就是在我的本地存储中存储图片的dataUri。我只使用javascript和angularJS。此时没有jQuery。

图片是通过 type =“file”的输入上传的,其中包含“ input_file_0 ”等ID。

我能够将id和dataUri存储在我的$ scope.files变量中。所以,如果我说< [input_file_0:File, input_file_1:File, ...] length:0 < input_file_0:File lastModified: 1457515898145 lastModifiedDate: Wed Mar 09 2016 10:31:38 GMT+0100 name: "name-of-picture.png" size: 206156 src: "data:image/png;base64,iVBORw0K..." type: "image/png" > input_file_1:File ,我会得到这样的输出:

$ scope.files

/*
 * stores $scope-values for longer reference in the localStorage
 * @returns {undefined}
 */
    $scope.storeDataInLocalStorage = function () {
        if (typeof (localStorage) !== 'undefined') {
            //storing file data
            var data = {};
            for (var i = 0; i <= $scope.files.length; i++) {
                data.push({ 'file_input_'+i : $scope.files['file_input_'+i].src}) ;
            }
            localStorage.setItem('files', JSON.stringify(data));
        }
        /* No localstorage support */
        else {
            alert("Sorry. Localstorage is not supported");
        }
    };

controller.js

localStorage.getItem('files') = 
{'input_file_0' : "data:image/png;base64,iVBORw0K...", 
 'input_file_1 : "data:image/png;base64,iVBORw0K..."}

我想实现像这样的localStorage项目:

private ArrayList<Item> list;

...
public AdapterMain() {
    list.add(new HeaderItem());
    list.add(new NormalItem());
    list.add(new HeaderItem());
    list.add(new NormalItem());
}


public Item getItem(int position) {
    return list.get(position);
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
    if (viewType == Item.TYPE_NORMAL) {
        View v = inflater.inflate(R.layout.adapter_normal, viewGroup, false);
        return new NormalViewHolder(v);
    } else if (viewType == Item.TYPE_HEADER) {
        View v = inflater.inflate(R.layout.adapter_header, viewGroup, false);
        return new HeaderViewHolder(v);
    }
    return null;
}


@Override
public int getItemViewType(int position) {
    return list.get(position).getItemType();
}

@Override
public int getItemCount() {
    return list.size();
}

public abstract class Item {
    public static final int TYPE_HEADER = 0;
    public static final int TYPE_NORMAL = 1;
    public abstract void bindToViewHolder(RecyclerView.ViewHolder holder);
    public abstract int getItemType();
}

但设置密钥不起作用。获取src属性可以正常工作。但是将变量作为键是行不通的。它总是用变量名替换它。

2 个答案:

答案 0 :(得分:0)

我自己尝试了尝试过之前尝试过的东西但是现在突然发生了。也许有一些东西已经存储在本地,我没有'正确删除它。

这次我没有使用push,所以我的代码看起来像这样:

controller.js

/*
 * stores $scope-values for longer reference in the localStorage
 * @returns {undefined}
 */
    $scope.storeDataInLocalStorage = function () {
        if (typeof (localStorage) !== 'undefined') {
            //storing file data
            var data = {};
            for (var i = 0; i <= $scope.files.length; i++) {

                data['input_file_'+i]= $scope.data['input_file_'+i].src;

            }
            localStorage.setItem('files', JSON.stringify(data));
        }
        /* No localstorage support */
        else {
            alert("Sorry. Localstorage is not supported");
        }
    };

还有人知道如何使用array.push()吗?

答案 1 :(得分:0)

使用额外的对象在for循环中添加项目:

  var data = [];
  for (var i = 0; i <= $scope.files.length; i++) {
        var o = {};
        o[('file_input_' + i)] = $scope.files['file_input_'+i].src;
        data.push(o);
   }
  localStorage.setItem('files', JSON.stringify(data));