我正在尝试做类似“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');
答案 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}}