是否有可能以任何方式执行以下操作而不必通过临时的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>
答案 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();
});
}
它应该可以正常工作。