在Ember中访问父控制器中的组件属性

时间:2014-07-07 08:10:39

标签: ember.js

我想访问一个属性,比如来自父控制器的组件中定义的selectedItem。怎么做到这一点?我想访问这个项目,以便我可以打开一个定义为部分的模态。如果有人可以建议任何更好的解决方案,也欢迎。

2 个答案:

答案 0 :(得分:3)

您可以将属性绑定到控制器的属性。像这样:

App.FooBarComponent = Ember.Component.extend({
    selectedItem: null,

    // set the property somewhere in your component 
});

在您的控制器中

App.SomeController = Ember.Controller.extend({
    fooBarSelectedItem: /* empty (null) or a value */
});

在您的模板中

{{foo-bar selectedItem=controller.fooBarSelectedItem}}

答案 1 :(得分:0)

我有一个“倒计时”组件,它会渲染一个时钟,当倒计时结束时,我需要禁用组件周围视图上的一些按钮。该解决方案与@ splattne的答案类似,但它是更新的Ember 3.1语法,共享值不是模型的一部分。

组件:

export default Component.extend({    
    'remaining_time': computed('timer_end', 'dummy', function() {
        let now = new Date();
        let remaining = this.get('timer_end') - now;
        if (remaining < 0) {
            scheduleOnce('afterRender', this, function(){
                this.set('event_listener.expired', true);
            });
            this.set('should_run', false);
            return "Countdown Closed";
        }
       ...
    }),
});

模板:

{{count-down timer_end=model.timer_end event_listener=countdown_status}}

控制器:

export default Controller.extend({
    countdown_status: Object.create({'expired': false}),

    controls_enabled: computed('countdown_status.expired', function() {
        return !this.get('countdown_status.expired');
    }),
    ...
});

注意scheduleOnce('afterRender'https://github.com/emberjs/ember.js/issues/13948需要这样做。如果您的组件在渲染整个视图之前更改了共享值,那么您将只需要它,不幸的是,这是我的。