Templates Ember.js-控制器及其视图之间的通信

Templates Ember.js-控制器及其视图之间的通信,templates,ember.js,controllers,Templates,Ember.js,Controllers,我只是在学习余烬的早期阶段,遇到了一些令人困惑的事情。 我试图在两个控制器之间进行通信,并更新它们相应的视图 在一个简化版本中,我想单击一个按钮在一个控制器上触发一个事件,这将启动另一个控制器上的计时器。这是可行的,但当值更改时,计时器的视图不会更新 以下是我所拥有的: var App = Ember.Application.create(); App.Route = Ember.Route.extend({ events: { startTimer: function

我只是在学习余烬的早期阶段,遇到了一些令人困惑的事情。 我试图在两个控制器之间进行通信,并更新它们相应的视图

在一个简化版本中,我想单击一个按钮在一个控制器上触发一个事件,这将启动另一个控制器上的计时器。这是可行的,但当值更改时,计时器的视图不会更新

以下是我所拥有的:

var App = Ember.Application.create();

App.Route = Ember.Route.extend({
    events: {
        startTimer: function(data) {
          this.get('container').lookup('controller:Timer').start();
        }
    }
});

App.ApplicationController = Ember.Controller.extend({

    actionWord: 'Start',

    toggleTimer: function() {
        var timer = this.get('container').lookup('controller:Timer');

        if(timer.get('running')) {
            timer.stop();
        } else {
            timer.start();
            this.set('actionWord', 'Stop');
        }
    }
});

App.TimerController = Ember.Controller.extend({

    time: 0,
    running: false,
    timer: null,

    start: function() {
        var self = this;

        this.set('running', true);

        this.timer = window.setInterval(function() {
            self.set('time',  self.get('time') + 1);
            console.log(self.get('time'));
        }, 1000);
    },

    stop: function() {
        window.clearInterval(this.timer);
        this.set('running', false);
        this.set('time', 0);
    }

});
对于模板:

 <script type="text/x-handlebars">
    {{ render "timer" }}

    <button {{action toggleTimer }} >{{ actionWord }} timer</button>
</script>

<script type="text/x-handlebars" data-template-name="timer">
   {{ time }}
</script>

{{呈现“计时器”}
{{actionWord}}计时器
{{time}}

更新:

忘了提到,如果打开控制台,可以看到TimeController函数中的时间正在更新,它只是没有显示在视图中

另外,直接在TimerController上调用start操作可以正确地更新视图


谢谢

您使用的是过时版本的Ember。 我已经把你的小提琴升级到了余烬rc3。我还用正确的方法替换了
container.lookup
的实例。
容器
几乎是一个私有对象


您使用的是过时版本的Ember。 我已经把你的小提琴升级到了余烬rc3。我还用正确的方法替换了
container.lookup
的实例。
容器
几乎是一个私有对象


太好了,谢谢!现在,如果我想从另一条路线进入呢?是否有类似于
this.routeFor('timer')
this.get('route.timer')?这些都记录在什么地方了吗?从另一条路线访问一条路线在概念上没有多大意义,你想实现什么?这很好,谢谢!现在,如果我想从另一条路线进入呢?是否有类似于
this.routeFor('timer')
this.get('route.timer')?这些都记录在某个地方了吗?从另一条路线访问一条路线在概念上没有多大意义,你想实现什么?
window.App = Ember.Application.create();

App.Route = Ember.Route.extend({
    events: {
        startTimer: function(data) {
            this.controllerFor('timer').start();
        }
    }
});

App.ApplicationController = Ember.Controller.extend({
    actionWord: 'Start',
    needs: ["timer"],
    toggleTimer: function() {
        var timer = this.get('controllers.timer');
        if(timer.get('running')) {
            timer.stop();
        } else {
            timer.start();
            this.set('actionWord', 'Stop');
        }
    }
});

App.TimerController = Ember.Controller.extend({
    time: 0,
    running: false,
    timer: null,

    start: function() {
        var self = this;
        this.set('running', true);
        this.timer = window.setInterval(function() {
            self.set('time',  self.get('time') + 1);
            console.log(self.get('time'));
        }, 1000);
    },
    stop: function() {
        window.clearInterval(this.timer);
        this.set('running', false);
        this.set('time', 0);
    }
});