【问题标题】:Ember js computed properties from model to view template?Ember js从模型计算属性到视图模板?
【发布时间】:2013-09-10 00:15:11
【问题描述】:

我想知道在视图模板中使用模型计算属性的正确方法是什么?考虑以下几点:

///
//MODEL//
////////////////////////////
App.Item = DS.Model.extend({
  imageDefault: DS.attr('string'),

  detailPic: function() {
    var url = this.get('imageDefault');
    var image = url.substr(url.lastIndexOf('/') + 1);
    var thumb = 'lg_' + image.substr(3);
    return url.replace(image, thumb);
  }.property('imageDefault'),
  });

 ///
 //VIEW//
 //////////////////////////////////////
 App.ItemDetailView = Em.View.extend({
   templateName: "itemDetail",
   //adt'l view logic...
 });

这是模板:

<script type="text/x-handlebars" data-template-name="itemDetail">
  <div class="row">
    <div class="pull-left item-detail-main-pic">
      <img {{bindAttr src="detailPic"}}>
    </div>

    test: {{controller.model.detailPic}}

</script>

因此,使用上面的代码,视图“ItemDetailView”将检索从 ArrayController“Items”中选择的第一个项目对象,并从 imageDefault 属性正确计算 detailPic。 img src bind-attr 将反映正确计算的 img src 并且把手 {{controller.model.detailPic}} 将正确显示相同的链接。

但是,当从 ItemsController (ArrayController) 中选择另一个项目时,

<img {{bindAttr src="detailPic"}}> 

不会更新,但视图模板中的测试把手 {{controller.model.detailPic}} 会更新。

我尝试了以下变体,结果相同。

//
<img bind-attr src=detailPic>

// 
<img bind-attr src=controller.model.detailPic>

在视图模板的模型中使用计算属性的正确方法是什么?还是应该避免?

【问题讨论】:

  • 您的第一件事是正确的,您可以设置一个显示问题的jsbin吗?什么是真正的更新?当您执行 {{detailPic}} 而不是 controller.model.detailPic 时会发生什么?

标签: ember.js


【解决方案1】:

由于测试 {{controller.model.detailPic}} 有效,请尝试改用该路径:

<img {{bindAttr src="controller.model.detailPic"}}>

同样令人惊讶的是,测试 {{controller.model.detailPic}} 有效但 {{detailPic}} 无效。在大多数模板中,controller 是多余的,因为控制器已经是模板的上下文。然后(假设控制器是 ObjectController).model 也将是多余的,因为 detailPic 属性将只是通过代理。从同一个模板尝试以下测试,看看发生了什么:

<pre>
this: {{this}}
controller: {{controller}}
controller.model {{controller.model}}
detailPic: {{detailPic}}
controller.detailPic: {{controller.detailPic}}
controller.model.detailPic: {{controller.model.detailPic}}
</pre>

【讨论】:

  • 奇怪,当我更改 {{bindAttr src="controller.model.detailPic"}} 时,我仍然无法正确更新图像 url。我的 detailPic 和 controller.detailPic 值也不会刷新,但如果我使用 {{bindAttr src="detailPic"}} 控制器.model.detailPic 值不会刷新。很简单,一旦加载视图,我在“bindAttr”中使用的任何内容都不会刷新。我做过实验,其中重新渲染视图是获取更新 detailPic 的唯一方法,但这似乎并不理想???那么有没有办法在不重新渲染的情况下从模型的计算属性中绑定属性???
  • 肯定有问题 - 模型计算属性中的 bindAttr 应该在不重新渲染的情况下更新,这是一个非常常见的用例,也是绑定的重点。如果您制作一个演示问题的 jsBin,我可以帮助调试...
  • 谢谢,我希望今天晚些时候添加一个 jsbin,但我确实想出了如何让它工作!我在我的 {{bind-attr}} 代码所在的标记周围添加了一个 {{#if detailPic}} 块。我想再深入一点,看看是不是需要在github上报告。再次感谢!
猜你喜欢
  • 2012-12-08
  • 2016-02-10
  • 2014-01-07
  • 1970-01-01
  • 1970-01-01
  • 2014-10-09
  • 1970-01-01
  • 2016-01-19
  • 1970-01-01
相关资源
最近更新 更多