【问题标题】:Making an Ember Computed Property depend on a Variable使 Ember 计算属性依赖于变量
【发布时间】:2014-07-23 07:40:08
【问题描述】:

假设我在视图上有一个计算属性:

TestView=Ember.View.extend({
  computedProperty:function(){
    return this.get("elementId")+"test"
  }.property("targetObject.{{elementId goes here}}")
})

我想让属性依赖于模型属性,其属性名称等同于该视图元素上的 id。但是,我还没有找到一种优雅的方法来做到这一点。我需要这样做以使我的代码尽可能通用。到目前为止,我的解决方案是让属性依赖于 targetObject 的 id,然后在我需要绑定更新时调用 object.notifyPropertyChange(id)。

增加一些清晰度。假设我有一个显示绑定到模型属性的数字的视图。但是,我希望数字在显示时用逗号格式化。我可以轻松地为每个可能的属性编写一个计算属性来进行格式化。相反,我只想要一个通用视图,它知道获取与视图的 elementId 属性同名的模型属性的值。这是我的 hacky 解决方案的一个示例:

TestView=Ember.View.extend({
  computedProperty:function(){
  var id=this.get("elementId")
    return addCommas(this.get("targetObject").get(id))
  }.property("id")
})

然后我打电话给: object.notifyPropertyChange(id) 每当模型上的属性之一发生更改时。它有效并实现了我的目标,但我一直在寻找更优雅的解决方案。

在视图中,格式化的值显示在自定义文本字段中。

{{view App.CustomTextField value=computedProperty id="someAttribute}}

【问题讨论】:

  • 您能提供更多上下文吗?我不确定您要达到的目标。视图的 id 在渲染后不会改变。视图中定义的属性已经封装在它的实例中。
  • 您可能需要在视图初始化中手动添加观察者。 emberjs.com/api/#method_addObserver
  • 我有视图元素,它们的 id 是模型的属性名称。我希望每个视图上的属性依赖于与该视图的 id 同名的属性,但我不想在 .property 中显式命名该属性(属性名称在此处)。相反,我想以编程方式设置它。
  • 我对你的问题仍然有些困惑。我做了这个小提琴,emberjs.jsbin.com/zukifoya/3/edit,每当更改具有相同名称的 id 属性时,它都会更新视图上的属性。无需在视图中显式定义属性名称。这就是你要找的东西吗?
  • 这正是我想要的。该解决方案的问题在于,它并不比定义依赖于属性的计算属性更好。我想要的是一个通用计算属性,它知道基于与该视图的 id 同名的属性进行更新。这样我就不必在视图上有数百个计算属性,每个属性的每个可能值都有一个。换句话说,这是我将在具有多个属性的多个模型中使用的视图,但每个模型都具有相同的功能(依赖属性除外)。

标签: ember.js


【解决方案1】:

只需使用一个用逗号格式化数字的助手。您不需要任何属性,无论是计算的还是其他的。

test.hbs

Hello, I am a formatted {{add-commas number}}.

helpers/add-commas.js

Ember.Handlebars.helper('add-commas', function(value) {
  return value.toLocaleString();
});

【讨论】:

  • 我担心的是我在 textField 中显示此值,并且该值被绑定到 textField 的 value 属性。你能将视图的属性绑定到辅助输出吗?
猜你喜欢
  • 2020-05-17
  • 2018-03-26
  • 1970-01-01
  • 2020-07-15
  • 2016-02-05
  • 1970-01-01
  • 2019-03-21
  • 2018-07-16
  • 2014-01-07
相关资源
最近更新 更多