开发者问题收集

从组件 VM 中的主 Vue.js 实例访问变量

2016-04-08
1906

这是一个非常简单的 Vue 应用,它将一个 prop 从主 VM 传递到组件。在我的实际应用中,此值是通过 vue-resource 获取的。

https://jsbin.com/tazuyupigi/1/edit?html,output

当然可以,但我很难从组件 VM 本身访问此值。

https://jsbin.com/hurulavoko/1/edit?html,output

如您所见,我的警报显示未定义。我该如何修复此问题?似乎是执行顺序的问题,但使用 compiled()created() 代替 ready() 没有任何区别。

1个回答

这是执行顺序的问题。主 Vue 实例在其内部内容编译完成之前不会“准备就绪”。这包括 hello 组件。

如果您需要在使用 bar 之前知道它已设置,您可以通过几种方式进行监控。您可以在父级中 $broadcast 事件,让子级知道 bar 已加载。或者,您可以在子组件中使用 watch 函数,在 bar 更新时进行更改。

如果您在 created()$set bar ,您的示例确实有效,但是使用 vue-resource 无论如何都会有延迟,因此您需要考虑到 greeting 在子级的 ready() 函数期间不会准备就绪。您要么必须设计 DOM 结构来处理 greeting 可能 undefined 的事实,要么必须使用事件或 watch 函数自己等待它。

使用 $broadcast 的示例:

Vue.component('hello', {
  template: 'From hello tag: {{ greeting }}',
  props: ['greeting'],
  ready: function() {

  },
  events:{
    'bar-ready':function(){
        alert(this.greeting)
    }
  }
});
new Vue({
    el: '#app',
    created: function() {
        this.$http.get('/path')
            .then(function(response){
                this.$set('bar',response.data);
                this.$broadcast('bar-ready')
            }.bind(this))
    }
});

$broadcast 文档: https://vuejs.org/api/#vm-broadcast

Jeff
2016-04-08