![](/img/trans.png)
[英]Ember.js binding to computed property in Ember.Object from controller doesn't work
[英]Ember.js binding an Ember object property to a controller property?
我试图将控制器的温度属性绑定到设置对象的temp属性。 我在余烬生成的控制器文件app / controllers / home.js中尝试此操作
var settings = Ember.Object.create({
temp: 66
});
export default Ember.Controller.extend({
temperatureBinding: "settings.temp"
});
在尝试其他可能的解决方案时,我发现当我创建设置对象时,此代码段可以工作:
App = Ember.Application.create(); App.settings = Ember.Object.create({ temp: 65 }) App.Controller = Ember.Controller.extend({ temperatureBinding: 'App.settings.temp', })
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Ember Starter Kit</title> <link rel="stylesheet" href="http://cdnjs.cloudflare.com/ajax/libs/normalize/3.0.1/normalize.css"> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <script src="http://builds.emberjs.com/tags/v1.13.5/ember-template-compiler.js"></script> <script src="http://builds.emberjs.com/tags/v1.13.5/ember.debug.js"></script> </head> <body> <script type="text/x-handlebars"> Temperature: {{temperature}} </script> </body> </html>
不幸的是,当我在home.js文件中尝试执行此操作时,它会引发错误,因为该文件中未定义App。 这种使用Ember进行数据绑定的方法是否可行? 如果是这样,我在做什么错?
请注意, 绑定已被弃用,不应使用 。
现在让我们讨论您的示例。 第一个示例无法正常工作,因为无法访问该settings
变量。 这是一个简单的JavaScript限制。 它只是文件关闭上下文中的一个变量,无法动态访问当前或外部关闭上下文。
因此,如果只有字符串"foo"
,则不能访问变量foo
。
第二个例子之所以有效,是因为有一些非常奇怪的魔术,因此不应该再使用!
基本上,如果绑定以大写字母开头(例如A
),则ember会尝试在全局window
上下文中解析它。 由于声明在局部范围内的应用程序(你没有一个var
在它的前面)烬可以访问window.App.settings.temp
通过只是在做window["App.settings.temp"]
不过, 不要使用它!
您应该使用的是计算属性和服务。 如果您具有某些全局状态,请为其创建服务! 因此,请不要使用大写字母进行绑定!
当您只想要一个简单的别名,而不必编写this.get('foo.bar')
且只想编写this.get('bar')
,应通过计算属性来实现。
代替
barBinding: 'foo.bar',
做
bar: Ember.computed.alias('foo.bar'),
您可以将其与服务结合使用,例如大写字母绑定:
myService: Ember.inject.service(),
foo: Ember.computed.alias('myService.foo'),
如果这样做,您将拥有foo
属性,该属性是服务上foo
属性的别名,因此是全局的。
但是,您始终可以将变量放入余烬对象中:
var settings = {foo: 12};
export default Ember.Controller.export({
settings:settings,
foo: Ember.computed.alias('settings.foo'),
});
这将按预期工作,除了以下几点:设置对象不是余烬对象,因此不可观察。 如果您执行settings.foo=42;
foo计算的属性将不会更新 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.