কীভাবে শর্তসাপেক্ষে পর্যবেক্ষণযোগ্য অ্যারেতে কোনও আইটেমটি চাপতে হয়?


103

আমি pushএকটিতে একটি নতুন আইটেম চাই observableArray, তবে কেবল যদি আইটেমটি ইতিমধ্যে উপস্থিত না থাকে। নকআউটজেএস এ অর্জনের জন্য কি কোনও "ফাইন্ড" ফাংশন বা প্রস্তাবিত প্যাটার্ন রয়েছে?

আমি লক্ষ্য করেছি যে removeএকটি অন ফাংশন observableArrayএকটি শর্ত কথা প্রসঙ্গে জন্য একটি ফাংশন পেতে পারেন। আমি প্রায় একই কার্যকারিতা চাই, তবে শর্তটি যদি সত্য হয় বা না হয় তবেই কেবল এটি চাপতে push

উত্তর:


223

একটি পর্যবেক্ষণযোগ্য অ্যারে একটি indexOfফাংশন প্রকাশ করে (মোড়ক থেকে ko.utils.arrayIndexOf)। এটি আপনাকে করতে দেয়:

if (myObservableArray.indexOf(itemToAdd) < 0) {
  myObservableArray.push(itemToAdd);
}

যদি দুটি প্রকৃতপক্ষে একই বস্তুর রেফারেন্স না হয় এবং আপনি কাস্টম তুলনা যুক্তি চালাতে চান তবে আপনি এই জাতীয় ব্যবহার করতে পারেন ko.utils.arrayFirst:

var match = ko.utils.arrayFirst(myObservableArray(), function(item) {
    return itemToAdd.id === item.id;
});

if (!match) {
  myObservableArray.push(itemToAdd);
}

এটি আইটেম টো অ্যাড এ সমস্ত বৈশিষ্ট্যের তুলনা করে? আমি কেবল একটি আইডি সম্পত্তি জন্য পরীক্ষা করা প্রয়োজন।
জাফা

5
এটি যাচাই করবে যে দুটি ঠিক একই জিনিস। আপনার যদি পৃথক বৈশিষ্ট্যগুলি পরীক্ষা করতে হয় তবে আপনি এটি ব্যবহার করতে পারেন ko.utils.arrayFirst। আমি উত্তরে একটি নমুনা যুক্ত করব।
আরপি নিমিমিয়ার

4
দুর্দান্ত পরামর্শ আমি আমার উত্তরটি পরবর্তী উত্তরে পোস্ট করেছি।
রেকে 36

1
@ রেক ৩36 আপনার আইটেম আইডি কখনও পরিবর্তন হবে এবং পর্যবেক্ষণযোগ্য হওয়া দরকার কিনা তার উপরে এটি নির্ভর করবে।
লুই 15

1
@ স্পেসম্যান - আপনার কোন সমস্যা হচ্ছে ===? আপনার কি নমুনা আছে? আপনি স্ট্রিংগুলি সংখ্যার সাথে বা অন্য কিছুর সাথে তুলনা করছেন?
আরপি নেইমায়ার

11

ধন্যবাদ আরপি আমার ভিউ মডেলের মধ্যে থেকে অবজেক্টের আইডি 'সম্পত্তি'র মাধ্যমে' নাম 'সম্পত্তি ফেরত দেওয়ার জন্য আপনার পরামর্শটি ব্যবহার করার উদাহরণ এখানে।

    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;
    };

এইচটিএমএলে, আমার নিম্নলিখিতগুলি রয়েছে ($ পিতামাতার এটি একটি টেবিল সারি লুপের ভিতরে থাকার কারণে):

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

0

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>

http://jsfiddle.net/rathore_gee/Y4wcJ/


0

পরিবর্তনের আগে আমি "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();
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.