数据未在Vuejs中更新

时间:2017-11-23 09:42:05

标签: javascript vue.js vuejs2 jquery-select2

首先让我解释一下我的用例,我在数据上有一个fee_map attr,这是一个对象列表,其中包含有关学生必须支付的费用,余额,支付模式等以及计算属性的数据,让我们说' updateOptions'返回一个id和text的对象列表,适合填充select2(支付模式),现在每当用户做某事时,都会调用updateOptions。以及其他一些用户操作程序将选择所选选项并在fee_map上设置,fee_map的结构如下所示。

data: {
    fee_map: {
        1: {
            details:{
                1: {
                    option_selected: "1",
                }
            }
            // other_attr
        },
        2: {
            details:{
                1: {
                    option_selected: "2",
                }
            }
            // other_attr
        },
    }

我有一个方法UpdateSelected,它将更新选择,我通过获取键并使用forEach循环遍历fee_map。然后将所选选项设置如下

var fee_map = this.fee_map;
t_keys = Object.keys(fee_map);
t_keys.forEach(function(t){
    f_keys = Object.keys(fee_map[t].details);
    f_keys.forEach(function(f){
         fee_map[t].details[f].option_selected = "2";
    });
});

现在,当我从这里更新option_selected时,我的fee_map没有更新新值。我在这里做错了什么?

2 个答案:

答案 0 :(得分:0)

你的物体对象比你迭代的深一级。因此,当你有fee_map [t] .details [f]时,f是关键字"详细信息"并且细节["细节"]未定义。你需要为细节对象做一个foreach,也可以在这里看到。

https://jsfiddle.net/50wL7mdz/78427/

var fee_map = this.fee_map;
  t_keys = Object.keys(fee_map);
  t_keys.forEach(function(t){
    f_keys = Object.keys(fee_map[t]);
    f_keys.forEach(function(f){
      d_keys = Object.keys(fee_map[t][f]);
      d_keys.forEach(function(d){
         fee_map[t].details[d].option_selected = "5";
      });
    });
  });

答案 1 :(得分:0)

经过多次努力,我发现代码在循环中过快地更新数据,但不知何故vue只在下一个tick上检测到更改,所以我不得不调用自调用函数作为Vue.nextTick的包装来保留上下文并更新Vue.nextTick回调中的selected_option,这是完美的。

下面的工作代码

(function(fee, ref){
    console.log("Registering vue tick");
    Vue.nextTick(function(){
       console.log("Vue ticked, updating selected option");
       fee.option_selected = ref;
    });
})(fee, ref);