【问题标题】:Ember Binding Component Template to ModelsEmber 将组件模板绑定到模型
【发布时间】:2015-09-22 15:13:01
【问题描述】:

您好,我有以下组件模板:

test-component.hbs: (produces img tag per model)

{{#each titleModels}}
<div class="item">
    <img {{action "owlItemClicked" id index on="click" }} {{bind-attr src=img}}></img>
</div>
{{/each}}

在父模板中使用

parent.hbs:
{{test-component action="titleClicked" parentController=controller titleModels=model}}

在 titleClicked 操作中,假设删除 clickedModel 并刷新模板以显示已删除的视图。

parent-controller.js:
   modelChanged: false,
   actions: {
        titleClicked: function(){
           self.get('model').removeObject(aSelectedModel);
           self.set('modelChanged',true);
         }
   }

测试组件观察titlesModel的变化并重新渲染模板:

test-component.js:

titleModelsChanged: function(){
   this.rerender();
 }.observes('parentController.modelChanged'),

this.rerender 方法已成功调用,并且已删除模型的特定 html 标记(例如下面定义的那个)不再出现​​在 DOM 中,用于从 test-component.hbs 生成的 html 页面,如预期的那样。

 <img {{action "owlItemClicked" id index on="click" }} {{bind-attr src=img}}></img>

检查 dom 时会显示剩余模型的 img 标签。但是,即使在我检查元素时它们存在于 DOM 中,它们也不会显示在实际的 html 页面中(我没有看到实际的 imgs)。

html页面重新渲染后剩余模型的img标签如何显示?

【问题讨论】:

    标签: ember.js


    【解决方案1】:

    首先,两个小笔记。 &lt;img&gt; 标签不能有结束标签。所以没有&lt;img&gt;&lt;/img&gt;,而只是&lt;img&gt;(或者&lt;img /&gt;)。

    在当前和未来版本的 Ember.js 中不推荐使用在您使用时更改上下文的 {{each}}。所以你应该将你的组件重写为

    {{#each titleModels as |titleModel|}}
      <div class="item">
        <img {{action "owlItemClicked" titleModel.id titleModel.index on="click" }} {{bind-attr src=titleModel.img}}>
      </div>
    {{/each}}
    

    现在回答你的问题。鉴于 &lt;img&gt; 标签在 DOM 中,但实际图像不可见,问题一定出在图像的 src 属性中。如果您在单独的选项卡中打开 src 中的 URL,您会看到应该看到的图像吗?

    JSBin http://emberjs.jsbin.com/mitadovero/edit?html,js,output 解决了这个问题。

    【讨论】:

    • 您好,我目前正在使用“ember”:“1.8.1”,并且正在升级到最新的稳定版。最初加载页面时,每个模型都会加载所有 标签,您实际上可以看到所有图像(因此它不是 src 的问题)。当我单击图像时,我想将其从视图中删除。我可以看到它从模型数组中删除了它,并且当我调用重新渲染时,它在检查的 DOM 中不存在。虽然 img 标签仍然存在。但是我在新呈现的 HTML 页面中看不到它们。
    • 好的,我明白了。我不确定这是否能解决它,但我认为您不需要致电rerender。据我所知,由于数据绑定,当您从数组中删除对象时,Ember 将自行重新渲染 {{each}} 循环。您是否尝试过删除观察者和对rerender 的调用?
    • 是的,我已经尝试过了。当我从 modelArray (titleModels) 中删除模型时,我希望它会因为绑定而自动更新视图。然而这并没有奏效,因此我尝试了观察者+重新渲染组合
    • 我创建了一个 JSBin,我认为它可以显示您的情况:emberjs.jsbin.com/ketusaruze/edit?html,js,output。当我单击图像时,它会从列表中删除。这是你想要的行为吗?另外,我不需要观察者。从数组中删除一个项目就足以让视图重新渲染。
    • 嗨 yorbro ...您的 JSbin 目前给我一个错误。我决定升级到最新版本的 ember(以确保不会导致问题)......升级时遇到了一些问题。如果我在升级后继续遇到此问题,会通知您。感谢您迄今为止的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多