【问题标题】:How to change a value in a Reactive Array and rerun the helper如何更改反应数组中的值并重新运行帮助程序
【发布时间】:2016-03-12 09:03:04
【问题描述】:

我在 Meteor 中使用 Reactive Array 包,无法弄清楚如何更改数组中的值并让助手重新运行。这是一件非常基本的事情,我一定遗漏了一些明显的东西,但我一直找不到答案。这是我的代码:

在客户端:

test_arr = new ReactiveArray([3]);

助手:

UI.registerHelper('array_test', function(){
  return test_arr.list();
});

在模板中:

{{array_test}}

在屏幕上我按预期看到“3”,但如果我用这个改变反应数组的值:

test_arr[0] = 4

屏幕上没有任何变化,即使我在控制台中运行 test_arr.list(),我看到 [4]。如果我推送一个新值:

test_arr.push(5)

然后助手重新运行,我在屏幕上正确地看到了4,5。所以值已经改变了,但是在我执行了一个不相关的“推送”操作之前,助手没有重新运行。

我在文档中看不到任何关于更新值的内容,只能添加和删除值。

有什么方法可以响应式地更新反应式数组中的值吗?

【问题讨论】:

  • 使用拼接。您可以创建一个处理单个元素的便捷方法。
  • 谢谢。 test_array.splice(position, 1, new_value) 完美运行。更好的是,在我的模板中使用 {{#each}}{{test_array}}{{/each}} 时,帮助程序仅针对更新的值运行,因此效率很高。您想发布您的解决方案作为答案,以便我接受吗?我认为如果这个例子出现在文档中会很有用,因为我不可能是唯一一个错过这个的人。

标签: javascript arrays meteor helper


【解决方案1】:

您可以使用ReactiveArray.splice() 替换反应式数组中的元素,甚至创建一个处理单个元素的便捷方法:

ReactiveArray.prototype.setAt = function(pos, item) {
  return this.splice(pos, 1, item);
};

arr = new ReactiveArray(['a', 'b', 'c']);
// ["a", "b", "c"]

arr[0];
// "a"

arr.setAt(0, "newVal");
// ["a"]

arr[0];
// "newVal"

【讨论】:

  • 我还发现如果完全重建数组,可能需要运行 if (typeof my_array !== "undefined") m_array.clear();为了强制帮助更新。
【解决方案2】:

当您按索引在数组中设置值时,看起来这个包不支持反应源。试试看这个package

【讨论】:

    猜你喜欢
    • 2015-01-14
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-17
    • 2019-07-26
    • 1970-01-01
    • 2019-07-16
    • 1970-01-01
    相关资源
    最近更新 更多