2013-04-18 58 views
8

是否有可能以任何方式執行以下操作,而不必通過臨時observables/computed observables?我有其用於查找顯示數據共同數據:KO數據綁定「text:」到具有參數的函數

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

結果:功能exectuded,參數被發現,邏輯確定,並返回計算的全名,但不顯示(可能因爲沒有可觀察的)

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

結果:contactId未被解析,因此正確的參數值不可見。

我想這樣工作正常我需要創建自定義綁定?

一般來說:我開始懷疑我的方法是否只加載一次數據並嘗試匹配id是一種好方法。任何意見?我更好地創建加入的數據庫表/視圖/ 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> 
+0

我只是好奇代碼...這是什麼'lookupContactName'認爲它的參數是,如果你使用'lookupContactName(使用ContactID)'?它只是得到字符串「contactId」? – bdesham

+0

一般而言,這應該起作用。你可以把JSFiddle放在一起來展示你的問題嗎? – nemesv

+0

將lookupContactName(contactId)更改爲lookupContactName(contactId()),這會給出正確的id,而不僅僅是不返回任何東西。感謝您的支持 – jcuypers

回答

0

我不太確定在這裏明白你的問題。你可以這樣做,如果你想:

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

它應該只是工作。

+0

抱歉,我必須學習jsfiddle,從來沒有使用過它......我取得了一些進展,但仍然沒有運氣。我會複製粘貼相關代碼,希望你能更好地理解。 – jcuypers

+0

嘿傢伙我找到了一個解決方案(旁路)。不明白爲什麼,但由於某種原因,返回只能在數組循環之外... – jcuypers

3

如果你的<span data-bind="text: lookupContactName(contactId())"></span>是在foreach循環中,那麼你需要在$ root前面加上方法,否則它會在它正在循環的數組中尋找「lookupContactName」。

嘗試:

<div>Creator: <span data-bind="text: $root.lookupContactName(contactId())"></span></div> 
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;