2017-10-20 87 views
0

我有一个很奇怪的问题。我有简单的服务和vue组件。在模板中,我有v-如果哪个监视服务变量(如果它是真的 - div应显示,否则不应该)。它在我定义具有指定布尔值的变量时起作用,但在变量未定义时不起作用。我的方法isOpened()将它评估为布尔值,所以我不明白为什么这个代码不能正常工作。也许下面的代码会解释这个问题更好:Strage Vue行为。 V-如果没有正确观察

<template> 
    <div id="communicate" v-if="service.isOpened()"> 
     This should display if 'f' property in service is true 
    </div> 
</template> 

<script lang="ts"> 
import Vue from 'vue'; 
import Component from 'vue-class-component'; 

class OtherService { 
    private f:boolean = false; //works, div is displayed with this line uncommented 
    //private f:boolean; // f is undefined - does not work with this line uncommented 

    public info(foo:string) { this.f = true; } 
    public isOpened() { return (this.f === true) } //f is evaluated to bool anyway so it should not be any difference 
} 
export default { 
    name: 'component', 
    data: function() { 
     return { 
      service: new OtherService() 
     } 
    }, 
    mounted: function() { 
     console.log(this.service.isOpened()) //prints always false - ok 
     setTimeout(() => { 
      this.service.info('setting f to true') // f is set to true 
      console.log(this.service.isOpened()) // prints true, div should display. 
     }, 2000) 
    } 
}; 

回答

2

这是因为没有办法打字稿值类transpiles性能。

考虑两类:

class ClassA { 
    private myProperty: boolean; 
} 

class ClassB { 
    private myProperty: boolean = false; 
} 

在ClassA的我们定义打字稿知道的属性。在ClassB中,我们定义一个TypeScript知道的属性并为其分配一个值。

在ES5这些transpile以下几点:

var ClassA = (function() { 
    function ClassA() { 
    } 
    return ClassA; 
}()); 

var ClassB = (function() { 
    function ClassB() { 
     this.myProperty = false; 
    } 
    return ClassB; 
}()); 

不难看到,一旦值赋给这个属性实际上只创建。如果没有它,Vue不会知道这个属性存在。

如果你看看vuejs.org的指南,有一个关于反应性的部分。

由于现代JavaScript(以及放弃Object.observe)的限制,Vue无法检测属性添加或删除。由于Vue在实例初始化期间执行getter/setter转换过程,因此数据对象中必须存在一个属性,以便Vue将其转换并使其处于被动状态。