【问题标题】:ember.js changing a view from another viewember.js 从另一个视图更改视图
【发布时间】: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)

标签: javascript ember.js


【解决方案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 请您给我看一个如何通过控制器层执行此操作的示例?谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多