繁体   English   中英

将Ember对象属性绑定到控制器属性的Ember.js?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM