Push
に新しいアイテムをobservableArray
に追加したいのですが、そのアイテムがまだ存在しない場合のみです。 KnockoutJSでこれを実現するための「検索」機能や推奨パターンはありますか?
remove
のobservableArray
関数は、条件を渡すための関数を受け取ることができることに気付きました。私はほとんど同じ機能が欲しいのですが、渡された条件が真であるかそうでない場合にのみプッシュします。
ObservableArrayはindexOf
関数(ko.utils.arrayIndexOf
へのラッパー)を公開します。これにより、次のことが可能になります。
if (myObservableArray.indexOf(itemToAdd) < 0) {
myObservableArray.Push(itemToAdd);
}
2つが実際には同じオブジェクトへの参照ではなく、カスタム比較ロジックを実行する場合、次のようにko.utils.arrayFirst
を使用できます。
var match = ko.utils.arrayFirst(myObservableArray(), function(item) {
return itemToAdd.id === item.id;
});
if (!match) {
myObservableArray.Push(itemToAdd);
}
どうもありがとう。次に、提案を使用して、ビューモデル内からオブジェクトの「id」プロパティを介して「name」プロパティを返す例を示します。
self.jobroles = ko.observableArray([]);
self.jobroleName = function (id)
{
var match = ko.utils.arrayFirst(self.jobroles(), function (item)
{
return item.id() === id(); //note the ()
});
if (!match)
return 'error';
else
return match.name;
};
HTMLでは、次のものがあります($ parentはテーブル行ループ内にあるためです):
<select data-bind="visible: editing, hasfocus: editing, options: $parent.jobroles, optionsText: 'name', optionsValue: 'id', value: jobroleId, optionsCaption: '-- Select --'">
</select>
<span data-bind="visible: !editing(), text: $parent.jobroleName(jobroleId), click: edit"></span></td>
ko.observableArrayでオブジェクトを検索
function data(id,val)
{ var self = this;
self.id = ko.observable(id);
self.valuee = ko.observable(val); }
var o1=new data(1,"kamran");
var o2=new data(2,"paul");
var o3=new data(3,"dave");
var mysel=ko.observable();
var combo = ko.observableArray();
combo.Push(o1);
combo.Push(o2);
combo.Push(o3);
function find()
{
var ide=document.getElementById("vid").value;
findandset(Number(ide),mysel);
}
function indx()
{
var x=document.getElementById("kam").selectedIndex;
alert(x);
}
function getsel()
{
alert(mysel().valuee());
}
function findandset(id,selected)
{
var obj = ko.utils.arrayFirst(combo(), function(item) {
return id=== item.id();
});
selected(obj);
}
findandset(1,mysel);
ko.applyBindings(combo);
<select id="kam" data-bind="options: combo,
optionsText: 'valuee',
value: mysel,
optionsCaption: 'select a value'">
</select>
<span data-bind="text: mysel().valuee"></span>
<button onclick="getsel()">Selected</button>
<button onclick="indx">Sel Index</button>
<input id="vid" />
<button onclick="find()">Set by id</button>
変更前に「valueWillMutate()」を追加し、変更後に「valueHasMutated()」を追加します。
for (var i = 0; i < data.length; i++) {
var needChange = false;
var itemToAdd = data[i];
var match = ko.utils.arrayFirst(MyArray(), function (item) {
return (itemToAdd.Code === item.Code);
});
if (!match && !needChange) {
MyArray.valueWillMutate();
needChange = true;
}
if (!match) {
MyArray.Push(itemToAdd);
}
}
if (needChange) {
MyArray.valueHasMutated();
}