2015-01-08 73 views
0

刚开始学习ember.js,目前正在从其指南开始学习TODO MVC。我目前在这一步:http://emberjs.com/guides/getting-started/show-when-all-todos-are-complete/输入类型='复选框'双向绑定不起作用?

我注意到如果我钩住“checked”属性到一个计算属性,双向绑定不工作,因为我会预期的。如果我手动选中/取消选中该复选框,该计算属性将不会更新该值。

这里是简化的示例(好象他们的实例是不够简单):

这里是车把代码。我只加了“{{allAreDone}}”元素只是为了能够看到价值实时:

//... 
<section id="main"> 
    {{outlet}} 
    {{input type="checkbox" id="toggle-all" checked=allAreDone}} 
    {{allAreDone}} 
</section> 
//... 

这里是JS代码段的控制器,但我简化它,使得它不是基于另一个属性:

// ... 
allAreDone: function(key, value) { 
    return false 
}.property() 
// ... 

现在,如果我检查框(即属性'checked'= true),'allAreDone'仍然会显示错误。如果输入类型是文本,结果将会不同。双向绑定复选框也将工作,如果它连接到一个非计算属性,例如:

// ... 
allAreDone: false 
//will return false if I uncheked the checkbox directly and vice versa 
// ... 

我只是想确认一下我的行为的理解是正确的。为什么它与“文本”类型不同?

谢谢!

回答

0

您的计算属性定义是只读的。没有办法设置值,只能得到它。从适应的the guides例如您的情况:

allAreDone: function(key, value) { 
    // setter 
    if (arguments.length > 1) { 
    this.set('_allAreDone', value); 
    } 

    // getter 
    return this.get('_allAreDone'); 
}.property('_allAreDone'), 

_allAreDone: false 

它使用一个内部属性存储的实际价值,但更多的东西的问题,具体的肯定适用。

+0

你需要一个'.property( '_ allAreDone')'在端部和用于'_allAreDone'等的初始值,从而http://emberjs.jsbin.com/xubuja/1/edit?html,js,console,输出 – Kalman

+0

确实!谢谢。 –

+0

谢谢。早些时候,我认为文字会有不同的表现。但是,我再次尝试后,它看起来与复选框一致。 – ShadyStego