【问题标题】:Ember 1.13, view lookupEmber 1.13,查看查找
【发布时间】:2015-06-16 03:00:22
【问题描述】:

在 ember 1.13 之前我使用的是

  var containerView = Em.View.views[view_id]; 

获取具有视图 id 的 ContainerView 实例,并手动将 childViews 添加到此容器视图中,这在以前可以正常工作。

从 ember 1.13 开始,不支持此视图查找。推荐的方法是什么?

问题是同一个 containerView 有多个具有不同 ID 的实例。所以我需要从查找中获取正确的 containerView 实例。

谢谢

更新:

我有一个父(小部件)组件: 父组件.hbs

.....

{{input value=someBinding1 click='showCalendar'}}
{{calendar-component month=month1 disableBefore=disableBefore1}}

{{input value=someBinding2 click='showCalendar'}}
{{calendar-component month=month2 disableBefore=disableBefore2}}

{{input value=someBinding3 click='showCalendar'}}
{{calendar-component month=month3 disableBefore=disableBefore3}}

.....

所以基本上我可以有多个日期(输入)字段,单击时应该显示一个日历组件。如果我编写上面的代码,它将创建日历组件的 3 个(或尽可能多的日期字段)实例。这些日期字段的数量是动态的。我不想创建这么多日历组件,因为我看到移动设备上的性能不佳。

所以我做的是:

.....

{{input value=someBinding1 click='showCalendar'}}
{{calendar-container-view id='calendarContainerView1'}}

{{input value=someBinding2 click='showCalendar'}}
{{calendar-container-view id='calendarContainerView2'}}

{{input value=someBinding3 click='showCalendar'}}
{{calendar-container-view id='calendarContainerView2'}}

.....

并且 calendar-container-view 有一个空的 childViews 数组开始。 当用户单击输入字段时,我使用 Em.View.views[containerViewId] 获取相应的 containerView 实例并将日历实例附加到它。 单击另一个输入时,我将其从旧的父容器视图中删除并将其添加到新的容器视图中。 所以只有一个由 parentComponent.js 创建并删除并添加到容器视图中的日历实例。

希望这是有道理的。如果需要,我可以创建一个 jsbin。

非常感谢!

【问题讨论】:

  • 推荐的做法是重组你的代码不使用视图。如果您确实需要使用视图,请以不需要这种手动查找的方式安排您的代码。如果您发布代码的骨架版本以便我们可以看到您正在尝试做什么,也许我们可以提供更多帮助。例如,谁在创建这些 containerView 的多个实例?它们与什么有关?谁在尝试向它们添加 childView?

标签: javascript ember.js


【解决方案1】:

我认为您可以通过模型实例来操作您的逻辑,而不是views(我的意思是这里的模型概念,它可能是一些对象的arrayrecords array)。

很明显你有model(作为一些数组),因为你提到了multiple instances

你可以这样做:

{{!-- list of input fields --}}
{{#each model as |item|}}
  {{item-input-field item=item value=item.someBinding1 clickInput="setCurrentItemWhenInstanceClick"}}
{{/each}}

{{!-- and one calendar-component --}}
{{#if currentItem}}
  {{calendar-component item=currentItem month=currentMonth disableBefore=currentDisableBefore}}
{{/if}}

其中item-input-fieldcomponent,它扩展input 并通过动作clickInput 将其item 传递给父组件或控制器(向上动作)。

然后父组件(或控制器)中的setCurrentItemWhenInstanceClick 操作应该设置currentItemcurrentMonthcurrentDisableBefore 数据(数据向下calendar-component),所以你的calendar-component将显示出来。

【讨论】:

  • 感谢 Artych,我这里唯一的问题是关于 HTML,如何将此日历组件添加为单击输入 (HTML) 文件的子/兄弟。单击另一个字段时,将其从旧输入中删除并添加到此新单击的输入中。
  • didInsertElement 上使用jquery detach + append,详细信息:stackoverflow.com/a/24162549/4950029(仅限第1 号!)
  • 好的,我认为它会这样工作。我唯一担心的是,这是 Ember 式的做事方式吗?我的意思是使用 jQuery 添加删除 DOM 元素?
  • 如果我们谈论 DOM 操作,我认为 jQuery 是 Ember 的重要组成部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-03
  • 1970-01-01
  • 2020-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多