8

一時的なオブザーバブル/計算されたオブザーバブルを通過することなく、次のことを行うことは何らかの方法で可能ですか? データを表示するためのルックアップに使用される共通データがあります。

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

結果:関数が実行され、パラメータが見つかり、ロジックはOKで、計算されたフルネームが返されますが、表示されません(おそらく観察できないため)

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

結果: contactId が解析されないため、正しいパラメーター値が表示されません。

これが正しく機能するには、カスタムバインディングを作成する必要があると思いますか?

一般的に、私は、データを一度だけロードして ID を一致させようとするアプローチが良いアプローチであるかどうかについて少し疑問を持ち始めました。ビューはありますか?結合された db テーブル/ビュー/SP を作成する方が良いですか?

ありがとう、J.

ここに、私が使用している関連コードがあります...将来の助けのためにjsfiddleを学びます。

すべてのアラートは期待値を返しています...しかし、それでもテキストデータバインディングは値を受け取りません

共通データ ライブラリ:

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

foreach ループ内にある場合<span data-bind="text: lookupContactName(contactId())"></span>は、メソッドの前に $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 に答える