当股票代码运行时自动更新Ember Handlebar助手

时间:2014-06-19 11:32:51

标签: ember.js binding handlebars.js

我正在尝试做类似“timeago”的事情,即使没有实际更改的绑定值,它也会在视图中自动更新。要做到这一点,我有以下应用程序范围的时钟自动收报机,我注入我的控制器,如下:

// Setup an app-wide clock that can be depended on for updates every second or minute
App.Clock = Ember.Object.extend({
    second: null,
    minute: null,

    init: function () {
        this.tick(); // run once initially
        this.scheduler();
    },

    scheduler: function () {
        Ember.run.later(this, function () {
            this.tick();
            this.scheduler();
        }, 1000);
    },

    tick: function () {
        var now = new Date();

        this.setProperties({
            second: now.getSeconds(),
            minute: now.getMinutes(),
        });
    }
});

// Initialize it and inject it into our controllers
App.register('clock:main', App.Clock, { singleton: true });
App.inject('controller', 'clock', 'clock:main');

行。现在我在Handlebars助手中使用它。这是我想我搞砸了一下:

Ember.Handlebars.registerBoundHelper('format-date', function (value) {
    return 'Testing: ' + this.get('clock.second');
}, 'clock.second');

然后我将其添加到视图中,类似{{format-date 'foo'}}。它显示初始数字(从时钟开始的秒数)就好了,但没有更新。我显然希望时钟以某种方式绑定到帮助程序,以便在这种情况下它会自动更新。我错过了什么?

编辑:大多数解决方案建议使用视图。我想在不使用视图的情况下这样做。理想情况下,我希望能够像这样使用帮助器:

Ember.Handlebars.registerBoundHelper('format-date', function (value) {
    return 'Testing: ' + this.get('clock.second');
}).property('clock.second');

1 个答案:

答案 0 :(得分:1)

我无法告诉你为什么你写的助手没有更新。据我所知,你使用的是有效的语法。但是,我可以告诉你,这肯定有用:

{{format-date date clock.second}}

传递clock.second属性告诉Ember.js帮助器依赖于该属性。你可以看到它正常工作here。我知道这是一个丑陋的黑客,但确实有效。

至于你拥有的代码,它应该有效,但不是。我会调查它,并可能提交Ember.js的错误。

编辑:看来这个问题已经提出before。引用文档(强调我的):

  

Ember.Handlebars.registerBoundHelper方法采用可变长度的第三个参数,表示传入值的额外依赖关系

因此虽然指南似乎有点模糊,但文档更明确。看起来你可能会被上面的黑客攻击。

或者,如果你想要一些更聪明的东西,我可以试试这个:

var createDateProperty = function(dependentKey) {
    return function() {
        // I would use moment, you can use whatever you want
        return moment(this.get(dependentKey)).format('MMMM Do YYYY');
    }.property(dependentKey, 'clock.second');
};

然后,使用它:

App.FooBarController = Ember.ObjectController.extend({
    formattedBirthday: createDateProperty('birthday')
});

然后只使用没有助手的属性:

{{formattedBirthday}}