我正在尝试将控制器的温度属性绑定到我的设置对象的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进行数据绑定?如果是这样,我做错了什么?
答案 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计算属性将不会更新。