我有一个ember(1.0.0-pre2)视图,它有一个表单和一个按钮。表单绑定到一个视图类,允许填充表单输入和收集输入的值。 现在点击按钮我想从表单值创建一个dto对象并将其发送到控制器。 按钮html如下
<input type="submit" value="Add" data-icon="plus" {{action addReport view.report target="controller"}} />
视图代码是
ContentView: baseView.extend({
task: null, //initialized when form is filled in
report: function () {
var task = this.get('task');
if (task == null)
return null;
return reportModel.create({
taskId: task.id
});
}.property()
})
控制器代码是
DayController: ember.Controller.extend({
addReport: function (evt) {
console.log(evt.context);
}
})
当我运行代码时,事件上下文为null。当我查看调试器时,report
计算属性仅在呈现视图时执行一次。在按钮上单击不计算计算属性 - 立即调用控制器方法。
非常相似的构造在同一个应用程序中工作正常,但对于不同的视图,方法在路由器中,而不是控制器:
<a href="#" {{action changeDate view.prevDate href=true}}>Prev</a>
视图:
HeaderView: baseView.extend({
prevDate: function () {
return addDays(this.get('_dataSource').date, -1);
}.property()
})
按钮有什么问题,为什么它不起作用而不起作用?
答案 0 :(得分:0)
不确定这是否是您的具体问题,但计算属性应指定依赖项。例如,
}.property('task')
Ember将缓存计算属性。依赖项允许Ember知道缓存属性何时失效。
答案 1 :(得分:0)
好的,经过一些调试我发现了核心的误解。
手柄action
辅助工具评估的操作上下文,仅在渲染时执行。这就是为什么另一个视图工作的原因 - 它不需要用户在当前视图中提供的数据,所有必要的信息在视图显示之前就已准备就绪。
因此必须在呈现视图之前提供context
字段,这与我的方案无关。我不得不求助于控制器
DayController: ember.Controller.extend({
addReport: function (evt) {
console.log(evt.view.get('report'));
}
})
太糟糕了,我希望我可以不用从控制器到视图创建其他依赖项。