8

是否有可能以任何方式执行以下操作而不必通过临时可观察对象/计算可观察对象?我有用于查找以显示数据的通用数据:

<span data-bind="text: lookupContactName(31)"></span>

结果:函数执行完毕,找到参数,逻辑ok,返回计算全名,但不显示(可能是因为没有observable)

<span data-bind="text: lookupContactName(contactId)"></span>

结果:没有解析contactId,因此看不到正确的参数值。

我想为了让它正常工作,我需要创建自定义绑定?

一般来说:我开始怀疑我只加载一次数据并尝试匹配 id 的方法是否是一个好方法。有什么意见吗?我更擅长创建连接的数据库表/视图/SP?

谢谢,J。

在这里,是我正在使用的相关代码片段......我将学习 jsfiddle 以获得未来的帮助。

ALL ALERT 正在返回预期值...但文本数据绑定仍然没有收到值

一个通用的数据库:

customers.Contact = function () {
    var self = this;

    id = ko.observable();
    title = ko.observable();
    givenname = ko.observable();
    surname = ko.observable();
    fullName = ko.computed(function () {
        return title()+". "+givenname()+" "+surname();
    });

    return {
        id: id,
        title: title,
        givenname: givenname,
        surname: surname,
        fullName: fullName
    };
};
customers.ContactList = function () {

    var self = this;

    contactList = ko.observableArray([]); //.publishOn("ContactList");

    loadContactData = function () {
        var self = this;

        customers.helperDataService.getContactData(loadContactDataCallBack);
    };

    loadContactDataCallBack = function (json) {
        var self = this;

        $.each(json, function (i, p) {

            var contact = new customers.Contact().id(p.Id)
                                                  .title(p.Title)
                                                  .givenname(p.Name)
                                                  .surname(p.Surname);

            contactList.push(contact);
        });

    };

    lookupContactName = function (id) {
        var self = this;

       alert("value to be found: "+id);

        ko.utils.arrayForEach(contactList(), function (contact) {
            alert("SEARCH:  contactid: " + contact.id() + " - " + "id: " + id);
            if (contact.id() === id) {
                alert("FOUND: contactid: " + contact.id() + " - " + "id: " + id);
                alert("value:" + contact.fullName());
                return contact.fullName();
            }
        });
    };

    return {
        loadContactData: loadContactData,
        lookupContactName: lookupContactName
    };
};

从这里调用...(我将其更改为 contactId() 并将正确的值传递给函数)

<div>Creator: <span data-bind="text: lookupContactName(contactId())"></span></div>
4

3 回答 3

3

如果您<span data-bind="text: lookupContactName(contactId())"></span>在 foreach 循环中,那么您需要在该方法前面加上 $root,否则它将在循环通过的数组中查找“lookupContactName”。

尝试:

<div>Creator: <span data-bind="text: $root.lookupContactName(contactId())"></span></div>
于 2013-10-20T01:51:58.003 回答
1

问题是您的查找函数没有返回值

ko.utils.arrayForEach(contactList(), function (contact) {
// some checking code
    return contact.fullName();
});

您的“返回”与传递给 arrayForEach 实用程序方法的内部函数有关。你需要这样的代码

var result;
ko.utils.arrayForEach(contactList(), function (contact) {
// some checking code
    result = contact.fullName();
});
return result;
于 2016-02-29T12:34:14.610 回答
0

我不太确定你的问题是什么。如果你愿意,你可以这样做:

function lookupContactName(cid) {
    var obj = ... // Find your object by id;
    return ko.computed(function () {
       return obj.name() + obj.lastname();
    });
}

它应该可以工作。

于 2013-04-18T13:16:16.983 回答