ember控制器:计算属性不重新计算注入属性

时间:2014-04-28 04:07:25

标签: javascript ember.js

我有一个自定义的ClockService对象,我将其注入到我的应用程序控制器中(取自ember js cookbook):

App.ClockService = Em.Object.extend({
  pulse: Ember.computed.oneWay('_seconds').readOnly(),
  tick: function () {
    var clock = this;
    Ember.run.later(function () {
      var seconds = clock.get('_seconds');
      if (typeof seconds === 'number') {
        clock.set('_seconds', seconds + (1/4));
      }
    }, 250);
  }.observes('_seconds').on('init'),
  _seconds: 0
});

Ember.Application.initializer({
  name: 'clockServiceInitializer',
  initialize: function(container, application) {
    container.register('clock:service', App.ClockService);
    application.inject('controller:application', 'clock', 'clock:service');
  }
});

我在应用程序控制器中根据时钟服务中的pulse属性创建一个计算属性:

App.ApplicationController = Em.ObjectController.extend({
    currentTime: function(){
        return moment().format('MMMM Do YYYY, h:mm:ss a');
    }.property('clock.pulse')
});

时间戳(使用Momentjs)可在屏幕上的主应用程序中查看,但不会随脉冲重绘。我做错了吗?

更新

在下面应用Kingpins更新,我现在有以下工作解决方案:

App.ApplicationController = Em.Controller.extend({
setTime: function() {
    var time = moment().format('MMMM Do YYYY, h:mm:ss a');
    this.set('currentTime', time);
    Em.run.later(this, this.setTime, .9999);
}.on('init'),

currentTime: undefined
});

1 个答案:

答案 0 :(得分:2)

你永远不会抓取pulse所以Ember永远不会计算它,因此永远不会看到它改变......

http://emberjs.jsbin.com/kajuqeja/1/edit

你也可以使用疯狂的_seconds项,因为它已被设置,它会更新

http://emberjs.jsbin.com/kajuqeja/2/edit

无论哪种方式,这似乎是一大笔开销,每1/4秒触发一次房产变更等等。如果你真的想在页面中保留这一点,那我就达到0.99秒,也许是沟渠整个时钟服务并为您的时间更新设置一个简单的Ember.run.later

http://emberjs.jsbin.com/kajuqeja/3/edit