ember.js 从另一个视图更改视图

Posted

技术标签:

【中文标题】ember.js 从另一个视图更改视图【英文标题】:ember.js changing a view from another view 【发布时间】:2012-02-02 18:29:51 【问题描述】:

我有一个显示视图,它显示列表中的选定项目。然后,当我单击编辑按钮时,它会通过 #if isEditing 显示编辑视图

当我单击列表中的另一个项目时,显示视图会更改为新的选定项目,但仍处于 isEditing 状态。

如何从另一个视图更改视图的 isEditing 状态?

目前我已经使用将 isEditing 设置为 false 的 FocusOut 函数完成了此操作,但我在此视图中有 2 个文本字段,因此当我单击另一个文本字段时,它也会触发 focusOut 函数。

这一定很简单,但似乎无法弄清楚!

【问题讨论】:

好吧,我最终这样做了,但它并不漂亮,我敢肯定这不是正确的方法! @get('parentView').get('parentView').get('childViews')[1].set('isEditing', false) 【参考方案1】:

好问题。我认为您需要做一些比简单绑定更复杂的事情来驱动App.SelectedItemView 的内容。我会尝试另一个计算属性:

App.SelectedItemView = Ember.View.extend(
  isEditing: false,
  content: function() 
    var selectedItem = App.SelectedItemController.get('content');
    this.set('editingItem', false);
    return selectedItem;
  .property('App.SelectedItemController.content'),
);

关于计算属性的技巧是,您可以完成与简单绑定相同的事情,但您也可以添加自定义代码以在观察值更改时执行(例如在这种情况下有条件地将 editingItem 设置为 null) .计算属性的缺点是进行双向绑定有点复杂(例如,在这种情况下,每当App.SelectedItemView.content 更改时设置App.SelectedItemController.content)——但听起来你不需要这样做无论如何。

【讨论】:

【参考方案2】:

如何从另一个视图更改视图的 isEditing 状态?

我不认为这是你真正想要做的。在该项目的单击事件中,您可能正在更改控制器的 content 属性。只要content 发生变化,您就希望isEditing 为假。

你可以设置一个观察者来处理这个:

App.SelectedItemView = Ember.View.extend(

    isEditing: false,
    contentBinding: 'App.SelectedItemController.content',
    contentChanged: function ()
    
        this.set('isEditing', false);
    .observes("content")
);

【讨论】:

【参考方案3】:

您不希望两个视图像这样在逻辑上直接连接 - 相反,您希望这种关联通过绑定发生(可能不是在这种情况下,因为编辑按钮似乎没有绑定到模型或属性?)还是通过控制器层中的函数?

【讨论】:

原来的问题也让我很感兴趣。在大多数情况下,通过绑定可能是正确的,但有时您只是不想设置一个额外的 Ember.Object 或一个额外的属性,只是为了将数据从一个视图传递到另一个视图。因此,我认为能够从另一个视图更改数据可能会有所帮助。 “通过控制器层”是什么意思? @jasonpgignac 请您给我看一个如何通过控制器层执行此操作的示例?谢谢

以上是关于ember.js 从另一个视图更改视图的主要内容,如果未能解决你的问题,请参考以下文章

Ember.js 的视图层

Ember.js 中的视图与组件

Ember.js - 如何在组件视图中呈现默认插座

Ember.JS - 如何在同一页面中使用多个模型、控制器和视图?

使用 Ember.js 按模型类型/对象值选择视图模板

ember.js + 车把:渲染 vs 出口 vs 局部 vs 视图 vs 控制