【问题标题】:如何通过 Vuejs 中的代码调用计算属性?
【发布时间】:2015-12-23 14:25:24
【问题描述】:

我正在使用 Vuejs 进行模板和数据绑定。这是我的 HTML:

<div id="message"></div>
<div id="items">
    <div v-show="list.length > 0">
        <button v-on="click: selectMode = true"
                v-show="!selectMode">Start Selection</button>
        <button v-on="click: selectMode = false" 
                v-show="selectMode">End Selection</button>
        <button v-on="click: selectAll">Select All</button>
        <button v-on="click: remove">Remove</button>
    </div>
    <ul>
        <list-item v-repeat="list"></list-item>
    </ul>
</div>
<script type="text/html" id="template">
    <li>
        <input type="checkbox" v-show="$parent.selectMode" 
               v-model="selected" name="checkbox" value="{{Id}}" />
        <label>{{Name}}</label>
    </li>
</script>

还有 JS:

var message = document.getElementById("message");
var items = [
    { Id: 1, Name: "Apple" },
    { Id: 2, Name: "Orange" },
    { Id: 3, Name: "Banana" },
    { Id: 4, Name: "Mango" }
];

var data = {
    list: items,
    selectedList: [],
    selectMode: false
}

var vue = new Vue({
    el: "#items",
    data: data,
    methods: {
        selectAll: function(){
            if(!this.selectMode){
                this.selectMode = true;
            }

            for(var i = 0; i < this.list.length; i++){
                this.list[i].$set("selected", true);
            }
        },
        remove: function(){
            var length = this.selectedList.length;
            if(length === 0){
                show("Nothing to remove");
                return;
            }

            while(length > 0){
                var index = this.selectedList.pop();
                this.list.splice(index, 1);
                length--;
            }
        }
    },
    components:{
        'list-item': {
            template: "#template",
            computed: {
                selected: {
                    get: function(){
                        return this.$parent
                            .selectedList
                            .indexOf(this.$index) > 0;
                    },
                    set: function(value){
                        show(this.Name + " " + (value ? "Selected" : "Deselected") + " at index: " + this.$index);
                        if(value){
                            this.$parent
                                .selectedList
                                .$add(this.$index);
                        }
                        else{
                            this.$parent
                                .selectedList
                                .$remove(this.$index);
                        }
                    }
                }
            }
        }
    }
});

function show(mess){
    message.innerHTML = mess;
    setTimeout(function(){
        message.innerHTML = "";
    }, 5000);
}

Vuejs 适当地将模板与列表绑定,并且项目在&lt;li&gt; 标签中按预期列出。问题是计算属性:selected。单击复选框时会触发该属性的设置器,但是,如果在代码中设置了该属性,则不会调用该设置器。

当点击“开始选择”按钮时,每个项目的复选框都是可见的。当用户单击复选框时,将调用计算的 selected 属性的设置器。但是,如果您按下“全选”按钮,将selected 属性设置为true,复选框是可见的,并且它们被适当地选中,但selected 属性的设置器没有被触发,这是意外的。为什么这不起作用?要么我遗漏了什么,要么这是 Vuejs 中的一个错误。

这里是小提琴的链接:http://jsfiddle.net/dreamakshay/c76rwugz/5/。这些是您可以尝试的几件事。

运行>点击开始选择>勾选复选框(setter触发)>Div中的消息,“删除”将删除选定的项目。

运行>单击全选(全部选中)>按删除> Div“Nothing to remove”中出现意外错误,这不应该发生。

感谢任何帮助。

【问题讨论】:

    标签: javascript vue.js


    【解决方案1】:

    您似乎忘记添加此行:

        selectAll: function(){
            if(!this.selectMode){
                this.selectMode = true;
            }
    
            for(var i = 0; i < this.list.length; i++){
                this.list[i].$set("selected", true);
                this.selectedList.push(this.list[i]); // This line
            }
        }
    

    【讨论】:

    • 谢谢杜威。我的原始代码中确实有这一行。但是,我似乎误解了 Vuejs 中的计算属性。我已经解决了这个问题。但我仍然将您的帖子标记为答案。
    猜你喜欢
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    • 2017-12-01
    • 2017-08-23
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多