简体   繁体   English

Vue:无法设置计算属性

[英]Vue: Can't set the computed property

I need some help with computed properties and ajax in vue.我需要一些有关 vue 中计算属性和 ajax 的帮助。

"filterFactories" is a list of factories. “filterFactories”是一个工厂列表。 The computed property "filterFactories" creates this list of factories.计算属性“filterFactories”创建了这个工厂列表。

Now, I want a new feature: I have a button for an ajax request which get some new factories.现在,我想要一个新功能:我有一个用于获取一些新工厂的 ajax 请求的按钮。 I want set the computed property "filterFactories" after an ajax request.我想在 ajax 请求之后设置计算属性“filterFactories”。 Unfortunately nothing happens.不幸的是什么也没有发生。 it makes no difference: 1. this.filterFactories = response;这没什么区别: 1. this.filterFactories = response; or 2. window.filterFactories = response;或 2. window.filterFactories = response; In both cases - nothing happened在这两种情况下 - 什么也没发生

Is it possible to update the "filterFactories" after the successfull ajax request?成功的ajax请求后是否可以更新“filterFactories”?

I have added a larger code snipped我添加了一个更大的代码剪断

 <div id="app"> <div id="filter"> <div class="row"> <div class="col-md-12"> <div class="input-group"> <span class="input-group-addon">Factory</span> <input type="text" class="form-control" placeholder="Name" aria-describedby="basic-addon1" v-model="searchFactory"> <div class="input-group-btn"> <button class="btn btn-default" type="submit" v-on:click="clearSearchFactory"> <i class="fa fa-times"></i> </button> </div> </div> </div> </div> <div class="row"> <div class="col-xs-12 col-md-6"> <Multiselect v-model="selectedCapabilities" :options="allCapabilities" label="name" placeholder= "Select capabilities" track-by="id" :multiple="true" ></Multiselect> </div> <div class="col-xs-12 col-md-6"> <Multiselect v-model="selectedCountries" :options="allCountries" label="name" placeholder= "Select countries" track-by="code" :multiple="true" ></Multiselect> </div> </div> </div> <!--Modal--> <div id="myModal" class="modal fade" role="dialog"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal">&times;</button> <h4 class="modal-title">{{this.clickedCapability.name}}</h4> </div> <div class="modal-body"> <!--......--> </div> <div class="modal-footer"> <button type="button" class="btn btn-success" data-dismiss="modal" @click="filterProperties">OK</button> <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> </div> </div> </div> </div> <div class="row" style="height: 35px; margin: 10px"> <button type="button" class="btn btn-outline-dark" v-for="cap in selectedCapabilities" @click="modalCapClicked(cap)" data-toggle="modal" data-target="#myModal"> {{ cap.name }} <i class="fa fa-cogs"></i></button> </div> <!--Factories--> <div class="row"> <div class="col-xs-12 col-sm-6 col-md-3 col-lg-2" id="myCard-wrapper" v-for="factory in this.filterFactories"> <!--a list of factories--> </div> </div> </div> <script> window.app = new Vue({ el: '#app', components: { Multiselect: window.VueMultiselect.default }, data() { return { //Capabilities allCapabilities: [], // alle Capabilities aus der Konfiguration die über das Json übermittelt wurden selectedCapabilities: [], // selektierte Capabilities clickedCapability: '', // im Modalfenster geöffnete Capability //Countries selectedCountries: [], // selektierte Countries allCountries: [], // alle Countries aus der Json //Factories searchFactory: '', // Freitext Suchfeld für Fabriken factories: [] // angezeigte Fabriken } }, computed:{ /* Filtert die Fabriken anhand der Kriterien: Suche-Input, Capabilities, Countries */ filterFactories: function(){ var filteredFactories = []; var allFilter = []; allFilter.push(this.filterFactoriesBySearchInput()); allFilter.push(this.filterFactoriesByCaps()); allFilter.push(this.filterFactoriesByCountries()); filteredFactories = allFilter.shift().filter(function(v) { return allFilter.every(function(a) { return a.indexOf(v) !== -1; }); }); return filteredFactories; } }, methods: { /* Filtert anhand der Suchfeld-Eingabe */ filterFactoriesBySearchInput(){ /*filter an return a new list of factories*/ }, /* Filtert anhand der Capabilities */ filterFactoriesByCaps(){ /*filter an return a new list of factories*/ }, /* Filtert anhand der Countries */ filterFactoriesByCountries(){ /*filter an return a new list of factories*/ }, /* Setzt die aktuell im Modal-Fenster geöffnete Capability */ modalCapClicked(cap){ this.clickedCapability = cap; } filterProperties(){ axios.post('.....................................') .then(function (response) { this.factories = response.data.factoriesJson; }) .catch(function (error) { console.log(error); }); }, clearSearchFactory(){ this.searchFactory = []; } }, beforeMount(){ axios.get('.........').then(response => { this.factories = response.data.elementsJson.factories; this.allCapabilities = response.data.elementsJson.config.capabilities; }); axios.get('.......').then(response => { this.allCountries = response.data; }); } }) </script>

Vue uses some magic for computed properties: it scans the function code and will automatically create watchers for the properties it finds within the code. Vue 对计算属性使用了一些魔法:它扫描函数代码并自动为它在代码中找到的属性创建观察者。 This works well for simple situations but has failed many times for me with loops, map, reduce, etc.这适用于简单的情况,但对我来说,循环、映射、减少等失败了很多次。

I use multiple workarounds as needed, what is simplest to understand is this: create an artificial property which you reference in the computed prop and then update as needed:我根据需要使用多种解决方法,最容易理解的是:创建一个您在计算道具中引用的人工属性,然后根据需要进行更新:

new Vue({
    data: {
        updated: 0,
    },
    computed: {
        myComputed(): {
            // ...
            // just a reference to the prop
            this.updated;
        },
    },
    methods: {
        myAjax(): {
            // ...
            // modifying the prop will trigger update of myComputed
            this.updated++;
        },
    },
});

Of course you should use names more appropriate to the use cases you have, however i have instances where i just called this property "updateDummy" ;)当然,您应该使用更适合您的用例的名称,但是我有一些实例,我只是将这个属性称为“updateDummy”;)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM