2016-02-25 24 views
0

对不起,如果这是一个愚蠢的问题。我处于Ember学习曲线最陡峭的部分中,试图让一个简单的应用程序成为我自己的学习工具,而我的谷歌正在让我无法理解如何做到这一点;使用并绑定组件{{input}}

我有一个组件基本上是一些模型对象与一些过滤选项。与此讨论相关的过滤器选项是自由文本搜索。我希望有一个{{input}}被绑定到一些影响结果列表的值,只要它被更新。

{{input type=text value=filterString}} 

在我的余烬缺乏了解,我会约束输入一个字符串属性的值,并有我filteredMatches计算性能取决于这一点。不过,如果我定义属性作为这样的:

filteredMatches: Ember.computed.filter('matches', 'filterString', function(match, index, array) { 

我在控制台日志得到一个错误:

Uncaught TypeError: callback.call is not a function 

如果我删除提及“filterString”,它工作正常,但当我在输入中输入内容时,过滤不会更新。

因此,在我对Ember有限的知识的情况下,我坚持了这一点;输入是否实际绑定到控制器上的filterString,而不是组件?根据我的理解,他们将会消失,我不使用显式控制器。如果是这样的话,我怎么能在我的组件中有一个计算属性取决于控制器属性?

如果不是这种情况(即不涉及控制器),我如何将输入绑定到组件属性并相应地对值更改作出反应?

ember -v 
version: 2.3.0-beta.2 
node: 5.6.0 
npm: 2.14.10 
os: win32 x64 

感谢您的帮助,并再次,对不起,如果这个问题是愚蠢的!

编辑:Kitler和Lux的答案都很有启发和帮助。我选择了Lux,因为它带有一个具体的解决方案,但我希望我可以接受这两个。为了弥补它,我一定会加入Slack频道。 :)

回答

2

Ember.computed.filter的签名为(dependentKey, callback)Checkout the documentation.

第二个参数必须是是一个函数。对于您的使用情况,请使用正常的计算属性:

filteredMatches: Ember.computed('matches', 'filterString', { 
    get() { 
     return get(this, 'matches').filter(item => item.indexOf(get(this, 'filterString')) >= 0) 
    } 
}) 
1

在这种情况下,你无法在谷歌上找到答案API documentation是地方,如果你看看Ember.computed.filter的文档,你会发现它只需要1个相关键。

为了解决您的问题,请使用Ember.computed以及Ember.Arrayfilter之一的功能。

对于此类问题的未来,请考虑加入我们的ember community slack频道。