vue js不会立即触发

时间:2018-03-12 10:27:26

标签: javascript php laravel vue.js

我的HTML代码:

<div id="app">
<table>
    <thead>
    <tr>
        <th>#</th>
        <th>title</th>
        <th>price</th>
    </tr>
    </thead>
    <tbody>
    <tr v-for="wage_definition in wage_definitions" :key="wage_definition.id">
        <td>{{ wage_definition.id }}</td>
        <td>{{ wage_definition.definition_title }}</td>
        <td>
            <input type="text" name="amount" @change="valueChanged(wage_definition)"
                   v-model.lazy="wage_definition.amount">
            <button v-if="wage_definition.changed" class="btn btn-sm btn-success"
                    @click="update(wage_definition)">save change
            </button>
            <span v-if="wage_definition.updated" class="label label-success">updated</span>
        </td>
    </tr>
    </tbody>
</table>

我的js代码是:

var app = new Vue({
    el: '#app',
    data: {
        wage_definitions: [{
            "id": 1,
            "definition_title": "first",
            "amount": 151,
            "created_at": null,
            "updated_at": "2018-03-12 14:34:27"
        }, {
            "id": 2,
            "definition_title": "second",
            "amount": 152,
            "created_at": null,
            "updated_at": "2018-03-12 14:34:34"
        }, {
            "id": 3,
            "definition_title": "another record",
            "amount": 0,
            "created_at": null,
            "updated_at": null
        }, {
            "id": 4,
            "definition_title": "hello",
            "amount": 0,
            "created_at": null,
            "updated_at": null
        }, {
            "id": 5,
            "definition_title": "world",
            "amount": 0,
            "created_at": null,
            "updated_at": null
        }, {
            "id": 6,
            "definition_title": "foo bar",
            "amount": 0,
            "created_at": null,
            "updated_at": null
        }]
    },
    methods: {
        valueChanged: function (wage_definition) {
            wage_definition.changed = true;
            wage_definition.updated = false;
        },
        update: function (wage_definition) {
            wage_definition.changed = false;
            wage_definition.updated = true;
        }
    }
});

更改输入值后,将显示“保存更改”按钮,但是当我点击“保存更改”按钮时,“更新”警报不会立即显示。 我必须更改另一个字段,然后显示“更新”警报。

我该如何立即制作?

这里是jsfiddle链接: https://jsfiddle.net/5qupbc3w/1/

1 个答案:

答案 0 :(得分:1)

当您使用动态添加到反应测试中的对象的属性时,会发生此行为。 Vue仅在原始数据上设置观察者。如果您希望Vue在反应性检查中包含新对象属性,则需要指示Vue使用Vue.set方法观察它们。例如,要在valueChanged方法中实现此目的:

valueChanged: function (wage_definition) {
    Vue.set(wage_definition, "changed",true);
    Vue.set(wage_definition, "updated",false);
}

您无需修改​​更新方法,因为属性在valueChanged方法创建后才会被激活。您还可以使用默认值将“已更改”和“已更新”属性添加到原始对象,以获得相同的结果。