更新数组后,vue.js没有更新DOM

use*_*325 3 javascript arrays vue.js

我通过AJAX读取了一个项目列表并将其推送到数据数组中:

loadSparepartFiles: function() {
    var vm = this;
    vm.activeSparepart.attachments = [];
    ajaxApi.loadJson('spareparts/sparepart/getFiles/'+vm.activeSparepartId, function(data) {
        for (var i = 0; i < data.files.length; i++) {
            vm.activeSparepart.attachments.push({
                filename: data.files[i]
            });
        }
    });
},
Run Code Online (Sandbox Code Playgroud)

在Chrome中的Vue devTools中,我可以看到更新的数据数组,但DOM列表仍然是空的.

模板:

<div v-for="file in activeSparepart.attachments" class="uk-width-1-2 uk-margin-bottom">
    <a href="{{ baseUrl }}/download/sparepart/{{ activeSparepartId }}/{{ file.filename }}" target="hidden-frame" class="block-link">
        <i class="delete uk-icon-remove"></i>
        <i class="icon uk-icon-image"></i>
        <span class="title">
            {{ file.filename }}
        </span>
    </a>
</div>
Run Code Online (Sandbox Code Playgroud)

activeSparepart对象在这里初始化:

resetSparepart: function() {
    this.activeSparepart = {
        alternates: [],
        locations: [],
        logs: [],
        usages: [],
        vendors: [],
        sparepart: {},
        attachments: []
    };
    this.activeSparepartId = 'new';
},
Run Code Online (Sandbox Code Playgroud)

Vue devTools显示以下内容:

Pri*_*ome 7

我认为问题在于你activeSparepart.attachments不是被动的.阅读http://rc.vuejs.org/guide/reactivity.html#Change-Detection-Caveats.

如果activeSparepart是对象并且您添加了属性attachments,则无法识别附件...

Vue不允许向已创建的实例动态添加新的根级别响应属性.但是,可以使用Vue.set(object,key,value)方法将反应属性添加到嵌套对象:

Vue.set(vm.activeSparepart, 'attachments', [])
Run Code Online (Sandbox Code Playgroud)