在组件内使用并绑定{{input}}

时间:2016-02-25 09:58:11

标签: ember.js

对不起,如果这是一个愚蠢的问题。我正处于Ember学习曲线中最陡峭的部分,试图让一个简单的应用程序作为我自己的学习工具,而我的google-fu让我无法理解如何做到这一点;

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

{{input type=text value=filterString}}

由于我对Ember的理解不足,我会将输入的值绑定到字符串属性,并使我的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的两个答案都很有启发性和帮助。我选择勒克斯的那个,因为它带有一个具体的解决方案,但我希望我能接受这两个。为了弥补这一点,我一定会加入Slack频道。 :)

2 个答案:

答案 0 :(得分: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 :(得分:1)

在这些时候,如果您无法在Google上找到答案,API documentation就是理所当然的地方,如果您查看Ember.computed.filter的文档,您会注意到它只需要1个相关密钥

为了解决您的问题,请使用Ember.computed以及Ember.Array filter个函数之一。

将来对于此类问题,请考虑加入ember community slack频道。