Ember.js - 根据对象属性更新CSS宽度

时间:2012-10-15 18:59:36

标签: css ember.js observable

@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);
  }
});
     

以下代码不起作用,但它解释了我的目标。用一个   把手模板,我想完成这个:

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

换句话说,我只想拥有<div>更新的宽度   objWidth属性更改时。

3 个答案:

答案 0 :(得分:6)

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/

制作完整代码的示例

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

答案 1 :(得分: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 :(得分:0)

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

例如:

在您的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}}