【问题标题】:Ember.js - Update CSS width based on an object propertyEmber.js - 根据对象属性更新 CSS 宽度
【发布时间】:2012-10-05 19:36:16
【问题描述】:

正如@andorov's answer 中提到的,OP 的理想代码(<div style="width:{{model.width}}"> 现在几乎只适用于 Ember 1.10

我是 Ember.js 的新手,我发现很难动态 更改 CSS。这是一个解释我的意思的例子:

var App = Em.Application.create();

App.MyObj=Em.Object.extend({
    objWidth:10
});

App.objController = Ember.ArrayController.create({
    content: [],
  createObj: function(){
      var obj = App.MyObj.create();
      this.pushObject(obj);
  }
});

下面的代码不起作用,但它解释了我的目标。用一个 Handlebars 模板,我要做到这一点:

{{#each obj in App.objController}}
     <div style="width:{{obj.objWidth}}"></div>
{{/each}}

换句话说,我只想拥有&lt;div&gt; 更新的宽度 当objWidth 属性发生变化时。

【问题讨论】:

    标签: css ember.js observable


    【解决方案1】:

    您的原始解决方案 style="{{dynamicStyleAttribute}}" 现在可以使用新的绑定属性语法 - http://emberjs.com/blog/2015/02/07/ember-1-10-0-released.html#toc_bound-attribute-syntax

    您需要将px 附加到width:300px 的值,并在其上调用Ember.String.htmlSafe('your string')

    请注意,仍有一些未解决的问题: https://github.com/emberjs/ember.js/issues/10783 https://github.com/emberjs/ember.js/issues/10870

    【讨论】:

      【解决方案2】:

      style 属性必须与bindAttr 绑定,将样式作为一个整体传递,而不仅仅是其中一个属性,因为它不理解这一点。此属性仅允许您以字符串形式访问样式,以直接元素为目标。如果您这样定义,则无法绑定到样式的属性。

      所以here's my sugestion:我创建了几个“模型”类,如下所示,实现了一个以像素为单位返回宽度的属性:

      var WidthEnabledModel = Em.Object.extend({
          width: 100,
          unit: "px",
          widthString: function() {
              return 'width: %@%@'.fmt(this.width, this.unit);
          }.property('width', 'unit')            
      });
      
      App.SampleModel = WidthEnabledModel.extend({
          itemName: ''
      });
      

      然后,对于您集合中的每个项目,我将该属性绑定到 style 属性:

      <script type="text/x-handlebars" data-template-name="sample">
          <div id="sample_area" style="width: 250px;">
          {{#each thing in controller.content}}
            <div class="item" {{bindAttr style="thing.widthString"}}>
                {{thing.itemName}}<br />
                {{thing.widthString}}
            </div>
          {{/each}}
          <div>
      </script>
      

      按照我在 jsfiddle 此处 http://jsfiddle.net/schawaska/ftWZ6/ 制作的完整代码的示例进行操作

      编辑: 我对小提琴进行了一些更改以添加更多功能,但设置宽度的部分保持不变。

      【讨论】:

        【解决方案3】:

        您是否尝试过创建视图并将其绑定到控制器?

        例如:

        在您的 Javascript 中:

        App.objView = Ember.View.extend({
            contentBinding : 'App.objController',
            widthBinding : 'content.width'
        });
        

        在您的车把中:

        {{#each Ember.App.objController}}
            {{#view Ember.App.objView contentBinding="this"}}
                <div style="width: {{width}};"></div>
            {{/view}}
        {{/each}}
        

        【讨论】:

        • 我试过这个,但似乎没有用。您似乎无法使用把手将变量插入style 值。以下是使用您的建议的 HTML 最终结果:style="width: &lt;script id='metamorph-6-start' type='text/x-placeholder'&gt;&lt;/script&gt;&lt;script id='metamorph-6-end' type='text/x-placeholder'&gt;&lt;/script&gt;;"
        猜你喜欢
        • 2013-02-22
        • 1970-01-01
        • 1970-01-01
        • 2020-12-30
        • 2021-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-21
        相关资源
        最近更新 更多