gpt4 book ai didi

javascript - 为什么 Meteor Collection 没有反应性行为?

转载 作者:行者123 更新时间:2023-12-03 11:47:02 25 4
gpt4 key购买 nike

TLDR:我想跟踪 Meteor Collection 的依赖关系,以找出我的模板助手不响应的原因。

我一直在尝试在 Meteor 中创建一个响应式(Reactive) list 组件,可以在不同的模板中重用。

模板:

<template name="checklist">
<ul>
{{#each items}}
<li>
<label>
<input
type="checkbox"
value="{{value}}"
checked="{{isChecked}}"
data-id="{{_id}}"
/> {{name}}
</label>
<span>&nbsp;&nbsp;&nbsp; Status: {{status}}</span>
</li>
{{/each}}
</ul>
{{checkedIds}}
</template>

Javascript:

if (Meteor.isClient) {

var list;

/**
*
* Creates a Checklist instance, with a local collection that maintains the status
* of all checkboxes: 'checked', 'unchecked' or 'indeterminate'
*
*/
function createChecklist() {

var _checked = new Meteor.Collection(null),

check = function(id) {
return _checked.upsert({_id: id}, {_id: id, status: 'checked'});
},

getStatus = function(id) {
var item = _checked.findOne({_id: id})
return item && item.status;
},

isChecked = function(id) {
return _checked.find({_id: id, status: 'checked'}).count() > 0;
},

getCheckedIds = function() {
return _checked.find({status: 'checked'}).map(function(doc){return doc._id});
},

toggle = function(id) {
if ( isChecked(id) )
return uncheck(id);
else
return check(id);
},

uncheck = function(id) {
return _checked.upsert({_id: id}, {_id: id, status: 'unchecked'});
};

return Object.freeze({
'check': check,
'getCheckedIds': getCheckedIds,
'getStatus': getStatus,
'isChecked': isChecked,
'toggle': toggle,
'uncheck': uncheck
});
}

Template.checklist.helpers({
items: [
{_id: 0, name: 'Item 1', value: 10},
{_id: 1, name: 'Item 2', value: 20},
{_id: 2, name: 'Item 3', value: 40},
{_id: 3, name: 'Item 4', value: 20},
{_id: 4, name: 'Item 5', value: 100},
],
isChecked: function() {
return list.isChecked(this._id);
},
status: function() {
return list.getStatus(this._id);
},
checkedIds: function() {
return EJSON.stringify(list.getCheckedIds());
}
});

Template.checklist.events({
'change [type=checkbox]': function(e, tmpl) {
var id = e.target.dataset.id;
list.toggle(id);
}
});

Template.checklist.created = function() {
list = createChecklist();
}
}

您会注意到,每当您选中某个复选框时,checkedIds 帮助程序都会进行响应式更新。但是,status 帮助程序不会被动更新。

我正在尝试:

  1. 跟踪 _checked 集合的依赖项,以确定 status 帮助程序是否已添加为计算。

  2. 了解为什么此帮助程序没有进行响应式更新。

如果有人可以帮助解决这些问题,我将不胜感激。

到目前为止,我已完成以下操作:

  1. 确认状态助手(及其函数调用)内有 Deps.active = true
  2. 将以下代码放入 status 帮助程序中,以检查当我勾选复选框时它是否失效(它永远不会失效):

    var comp = Deps.currentComputation;
    comp.onInvalidate(函数() {
    控制台.track();
    });

最佳答案

_id 在 Mongo 中存储为字符串。

更改为:

getStatus = function(id) {
var item = _checked.findOne({_id: String(id)})
return item && item.status;
},

关于javascript - 为什么 Meteor Collection 没有反应性行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26007384/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com