0

我正在使用 JsViews 呈现一个列表,但首先通过一个辅助函数传递列表,如下所示:

<ul>
  {^{for ~filter(list, 'xyz')}}
    <li>...</li>
  {{/for}}
</ul>

Where根据过滤条件filter创建一个新列表,list其中仅包含一些原始元素。问题是,当我更新时list

$.observable(data.list).insert(list.length, { ... });

没有{^{for ...}}得到重新评估。但是,如果我删除过滤器,将其更改{^{for ...}为:

{^{for list}}
  ...
{{/for}}

然后一切都按预期工作。有没有办法实现我所追求的?似乎 JsViews 应该能够做我想做的事,因为这个答案很相似:JsViews: Converter before helper function in data-link

4

2 回答 2

2

@Jrop:目前,您的解决方法很有意义。您的场景与 JsObservable 的一些未来功能有关,用于将链接数组与定义源数组和目标数组之间关系的转换(例如过滤器、排序或页面)。每当源中可观察到的更改导致其内容发生更改时,目标将引发数组更改事件。

当前的可观察 API 应该可以在今天实现这一点,但是在 JsViews 中还没有开箱即用的半声明性方法。

另一种方法可能是派生{{for_with_filtering ...}}标签,派生自{{for}}但您可以选择在其中包含过滤器:{{forplus list filter=~filter('xyz')}}. 我将很快发布一个相关示例,其中显示一个 {{for}},它可以让您设置迭代的开始和整数。( {{for_range ...}})。

于 2013-06-07T21:21:49.093 回答
0

Okay, so I found a workaround to this, although I sure would like @BorisMoore to weigh in on this!

The solution is to update the view manually, because the filtered data does not === the bound data (I guess). So instead of doing:

$.observable(data.list).insert(data.list.length, item);

I changed to:

data.list.push({...});
$.view('#target', true, 'data').refresh();

Where #target is the selector of the target <div> that holds the rendered content.

Again, I really would be glad if @BorisMoore could weigh in on this, as this solution refreshes a chunk of the view instead of incrementally adding an item (from what I understand).

于 2013-06-04T15:36:45.097 回答