Knockout.js 如何在淘汰视图中引用此项

Knockout.js 如何在淘汰视图中引用此项,knockout.js,reference,Knockout.js,Reference,大家好,今天我有一个非常简单的问题要问你们 我有以下标记(视图): 更新2 实际上,如果我调整我的函数,将id作为参考,可能会有所帮助,因为当if调用firstMatch()时,我应该能够使用this.property访问当前上下文中的成员 //identify the first matching item by id self.firstMatch = ko.computed(function (id) { var search = false;

大家好,今天我有一个非常简单的问题要问你们

我有以下标记(视图):

更新2 实际上,如果我调整我的函数,将
id
作为参考,可能会有所帮助,因为当
if
调用
firstMatch()
时,我应该能够使用
this.property
访问当前上下文中的
成员

    //identify the first matching item by id
    self.firstMatch = ko.computed(function (id) {
        var search = false;
        ko.utils.arrayForEach(self.members, function (member) {
            if (member.id == id) {
                search = true;
            }
        });
        return search;
    });

这似乎解决了我的问题。我只是像往常一样把事情复杂化了

更新的视图():

现在我只需要弄清楚为什么我没有进入
ko.utils.arrayForEach(self.members(),function(member){…})我应该是金色的

更新1 正如@Haridarshan建议检查
self.members()
是否为空,这就是我得到的结果:

self.members() == ""    => true
self.members() == null  => false

self.members() === ""   => false
self.members() === null => false
果然
self.members().length
返回一个0

人力资源管理

更新2 看看以下两者之间的区别:

self.members = ko.observableArray();

如果有的话

更新3 为什么它没有早点击中我。
self.members
数组显示0且未进入循环的原因是,获取单个成员的调用是异步完成的。这意味着ajax完成了它的工作,其余的代码也顺利运行。但是,这带来了一个问题,即在检查时数组中没有成员


现在,由于每个人的输入,这个问题得以解决。

检查self.members()是否有值。如果为空,它将不会进入循环

您可以尝试
$data
吗?Instead一直在尝试从淘汰文档到其他所有内容,但运气不太好。但我确信我正在接近。我有
self.members=ko.observable([])初始化为空数组(就在从数据库初始化成员之前),这意味着它可以为空(如果在某个点上未添加成员),但不能为null。因此,如果数组是空的,它应该跳过foreach,但如果不是空的,它应该允许我访问单个对象,这样我就可以执行交叉引用检查。如果self.members()将有值,那么它肯定会进入循环,但如果它是空的或null,它将跳过。提供JSFIDLE将对解决您的问题有很大帮助。ko.observearray()是一个可观察的数组,其中as ko.observeable([])是一个正常的可观察的数组,您在其中通过了该数组。在ko.observearray()中,可以像在数组中一样直接推送项,例如self.members.push(value);但是在ko.observable([])中,您推送存储在observable中的数组中的值,例如self.members().push(值);谢谢你的解释@Haridarshan。对我来说,这无疑是一个正确的观点。
<div class="cards" data-bind="sortable: { data: cards, afterMove: cardMoved }">
    <div class="card">
        <div><span data-bind="text: title"></span></div>
        <div class="dnnRight" data-bind="if: firstMatch(id)">
            <a href="#" class="dnnSecondaryAction" data-bind="click: $root.openCard"><%= LocalizeString("EditBtn") %></a>
            <a href="#" class="dnnSecondaryAction" data-bind="click: $parent.removeCard"><%= LocalizeString("DeleteBtn") %></a>
        </div>
    </div>
</div>
    //identify the first matching item by id
    self.firstMatch = function (id) {
        console.log('firstmatch()');
        var search = false;
        console.log('search: ', search);
        ko.utils.arrayForEach(self.members(), function (member) {
            console.log('member.id', member.id);
            if (member.id == id) {
                search = true;
            }
        });
        console.log('search: ', search);
        return search;
    };
self.members() == ""    => true
self.members() == null  => false

self.members() === ""   => false
self.members() === null => false
self.members = ko.observableArray();
self.members = ko.observable([]);