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

时间:2016-09-02 20:06:57

标签: javascript ember.js

我正在尝试将控制器的温度属性绑定到我的设置对象的temp属性。我在ember生成的控制器文件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进行数据绑定?如果是这样,我做错了什么?

1 个答案:

答案 0 :(得分:1)

请注意bindings are deprecated and should not be used

现在让我们讨论你的例子。第一个示例无法工作,因为无法访问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',

DO

bar: Ember.computed.alias('foo.bar'),

您可以将此与服务结合使用,以获得类似大写字母的绑定:

myService: Ember.inject.service(),
foo: Ember.computed.alias('myService.foo'),

如果这样做,您将拥有foo属性,该属性是服务上foo属性的别名,因此是全局的。

但是总是做的只是将一个变量放入一个ember对象中:

var settings = {foo: 12};
export default Ember.Controller.export({
  settings:settings,
  foo: Ember.computed.alias('settings.foo'),
});

这将按预期工作,除了一件事:设置对象不是一个ember对象,因此不可观察。如果你执行settings.foo=42;,则foo计算属性将不会更新