【问题标题】:Ember.js view computed property is not passed to action handlerEmber.js 视图计算属性未传递给操作处理程序
【发布时间】:2012-11-21 18:08:47
【问题描述】:

我有 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);
    }
})

当我运行代码时,事件上下文为空。当我查看调试器时,report 计算属性只执行一次,即呈现视图时。单击按钮时,计算的属性不会被评估 - 控制器方法会立即被调用。

非常相似的构造在同一个应用程序中可以正常工作,但对于不同的视图,方法是在路由器中,而不是在控制器中:

<a href="#" {{action changeDate view.prevDate href=true}}>Prev</a>

查看:

HeaderView: baseView.extend({
    prevDate: function () {
        return addDays(this.get('_dataSource').date, -1);
    }.property()
})

按钮有什么问题,为什么它不起作用而不是链接?

【问题讨论】:

  • 在我尝试回答之前,我只是想验证一下:您在报告属性函数中有var task = this.get('task')——这意味着task 是您代码中ContentView 上的一个属性,但只是省略了从例子中?
  • 是的,task 是 ContentView 的属性。我更新了问题中的代码。

标签: action ember.js


【解决方案1】:

不确定这是否是您的具体问题,但计算属性应指定依赖项。例如,

}.property('task')

Ember 将缓存计算的属性。该依赖项允许 Ember 知道缓存属性何时失效。

【讨论】:

  • 不,添加依赖项没有帮助。但据我了解,默认情况下,如果未指定缓存和依赖项,则在每次访问时评估该属性?
【解决方案2】:

好的,经过一番调试,我发现了核心误解。

由把手action 助手评估的动作的上下文,仅在渲染时执行。这就是其他视图起作用的原因 - 它不需要用户在当前视图中提供的数据,所有必要的信息在视图显示之前都已准备好。

因此,必须在呈现视图之前提供 context 字段,这与我的场景无关。我必须求助于控制器中的解决方法

DayController: ember.Controller.extend({
    addReport: function (evt) {
        console.log(evt.view.get('report'));
    }
})

太糟糕了,我希望我可以不创建从控制器到视图的额外依赖项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-29
    • 1970-01-01
    • 2017-12-18
    • 2013-11-29
    • 1970-01-01
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多