【发布时间】: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