KO数据绑定“text:”到带参数的函数

时间:2013-04-18 13:09:53

标签: knockout.js

是否有可能以任何方式执行以下操作而不必通过临时的observables / computed observables?我有用于查找显示数据的常用数据:

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

结果:函数被exectuded,参数被找到,逻辑正常,并返回计算的全名,但没有显示(可能因为没有可观察的)

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

结果:未解析contactId,因此无法看到正确的参数值。

我认为为了正常工作,我需要创建自定义绑定吗?

总的来说:我开始怀疑我的方法是否只加载一次数据并尝试匹配id是一种很好的方法。任何意见?我最好创建联合数据库表/视图/ SP?

谢谢, 学家

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

所有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>

3 个答案:

答案 0 :(得分:3)

如果你的<span data-bind="text: lookupContactName(contactId())"></span>处于foreach循环中,那么你需要在$ root之前添加方法,否则它将在循环波形的数组中寻找“lookupContactName”。

尝试:

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

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

我不太清楚这里有什么问题。如果你愿意,你可以这样做:

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

它应该可以正常工作。