অর্ডার বাইয়ের পরে অ্যাংুলারজেস ভুল $ সূচক


92

আমি অ্যাঙ্গুলার.জেএস-এ নতুন এবং আমার অ্যারে বাছাই করতে এবং সেই সাজানো ডেটা নিয়ে কাজ করতে কিছু সমস্যা আছে।

আমার আইটেমগুলির সাথে একটি তালিকা আছে এবং এটি এখনই কাজ করে যাচ্ছেন "Store.storeName" দ্বারা এটি বাছাই করতে চাই। তবে ডেটা বাছাইয়ের পরে, আমার মোছা-ফাংশন আর কাজ করছে না। আমি মনে করি thats কারণ ing সূচকটি বাছাইয়ের পরে ভুল, এবং তাই ভুল ডেটা মোছা হয়।

আমি কীভাবে এটি সমাধান করতে পারি? সুযোগে ডেটা অর্ডার করে দিচ্ছেন না? কিভাবে যে কি?

এখানে কিছু প্রাসঙ্গিক কোড দেওয়া হল:

দেখুন মধ্যে:

<tr ng-repeat="item in items | orderBy:'Store.storeName'">
                <td><input class="toggle" type="checkbox" ng-model="item.Completed"></td>
                <td>{{item.Name}}</td>
                <td>{{item.Quantity}} Stk.</td>
                <td>{{item.Price || 0 | number:2}} €</td>                
                <td>{{item.Quantity*item.Price|| 0 | number:2}} €</td>
                <td>{{item.Store.storeName}}</td> 
                <td><a><img src="img/delete.png" ng-click="removeItem($index)">{{$index}}</a></td>
            </tr>

এবং আমার নিয়ামকটিতে আমার এই মুছে ফাংশন রয়েছে, যা নির্দিষ্ট ডেটা মুছে ফেলা উচিত:

$scope.removeItem = function(index){
        $scope.items.splice(index,1);
    }

ভিউতে অর্ডার দেওয়ার আগে এটি দুর্দান্তভাবে কাজ করে। যদি গুরুত্বপূর্ণ কিছু অনুপস্থিত থাকে তবে দয়া করে আমাকে এখনই ছেড়ে দিন।

ধন্যবাদ!

উত্তর:


140

পরিবর্তে বা এর উপর রিলেিং $index- যা - আপনি যেমনটি লক্ষ্য করেছেন - অনুসারে বাছাই করা / ফিল্টার করা অ্যারেতে সূচকটি নির্দেশ করবে, আপনি নিজের removeItemফাংশনে আইটেমটি নিজেই দিতে পারেন :

<a><img src="img/delete.png" ng-click="removeItem(item)">{{$index}}</a>

এবং নিম্নলিখিত হিসাবে অ্যারের পদ্ধতিটি removeItemব্যবহার করে একটি সূচক খুঁজতে ফাংশনটি সংশোধন করুন indexOf:

$scope.removeItem = function(item){
   $scope.items.splice($scope.items.indexOf(item),1);
}

4
@ pkozlowski.opensource আপনি একজন প্রতিভা! আপনি একটি আইটেম পাস করতে পারেন, সূচক না .. বাহ !! ধন্যবাদ মানুষ.
অদ্ভুত

ইন্টারনেট এক্সপ্লোরার 8 এবং এর চেয়ে কম অ্যারে ইনডেক্স অফ পাওয়া যায় না।
পিটার হেডবার্গ

4
প্রশ্নের শিরোনামটি অর্ডার বাইয়ের পরে ভুল $ সূচক সম্পর্কে জিজ্ঞাসা করছে, যা এই উত্তরটির ঠিকানা দেয় না। এমন ক্ষেত্রে রয়েছে যেখানে আপনার সঠিক $ সূচক মান প্রয়োজন (যেমন তালিকায় শিফট নির্বাচন করুন)। অর্ডার বাই ফিল্টার প্রয়োগ হওয়ার পরে আমরা কীভাবে সঠিক $ সূচক মান পেতে পারি?
ক্লিয়ারক্লাউড 8

আপনি এই জাতীয় কিছু করেও টেমপ্লেটের অভ্যন্তরে অর্ডার করা তালিকা থেকে একটি নতুন অ্যারে তৈরি করতে পারেন: "এলে ইন অর্ডারড_আরে = (অ্যারে | ফিল্টার: ফিল্টার | অর্ডার বাই: অর্ডার_বি)"
পোরলুন

ঝরঝরে! ধন্যবাদ ভাই.
সেন্ট 1PEDE

23

আমি কৌনিকটি শিখতে শুরু করেছিলাম এবং অনুরূপ সমস্যার মুখোমুখি হয়েছিলাম, এবং @ পকোজ্লোস্কি-ওপেনসোর্সের উত্তরের ভিত্তিতে আমি এটিকে ঠিক এর মতো কিছু দিয়ে সমাধান করেছি

<a>
  <img src="img/delete.png" ng-click="removeItem(items.indexOf(item))">
  {{items.indexOf(item)}}
</a> 

4
এই সবচেয়ে ভাল এবং বরং কাস্টম ফিল্টার ইত্যাদি তৈরি চেয়ে এত সহজ .. + 1
রফিক মোহাম্মদ

4
এটা কিভাবে সঠিক উত্তর না? এটি আমার সমস্যার সমাধান করেছে
সাইরাস জেই

19

আমার একই সমস্যা ছিল এবং এই বিষয়ে অন্যান্য উত্তর আমার পরিস্থিতির জন্য উপযুক্ত নয়।

আমি কাস্টম ফিল্টার দিয়ে আমার সমস্যাটি সমাধান করেছি:

angular.module('utils', []).filter('index', function () {
    return function (array, index) {
        if (!index)
            index = 'index';
        for (var i = 0; i < array.length; ++i) {
            array[i][index] = i;
        }
        return array;
    };
});

যা এইভাবে ব্যবহার করা যেতে পারে:

<tr ng-repeat="item in items | index | orderBy:'Store.storeName'">

এবং তারপর HTML এ আপনি ব্যবহার করতে পারেন item.indexপরিবর্তে $index

এই পদ্ধতিটি বস্তুর সংগ্রহের জন্য উপযুক্ত।

দয়া করে মনে রাখবেন যে প্রয়োগ করা সমস্ত ফিল্টার (অর্ডার বাই ইত্যাদি) তালিকার এই কাস্টম ফিল্টারটি প্রথম হওয়া উচিত এবং এটি indexসংগ্রহের প্রতিটি বস্তুর মধ্যে অতিরিক্ত সম্পত্তি (নামটি কাস্টমাইজযোগ্য) যুক্ত করবে।


অন্যান্য উত্তরগুলি আপনার পরিস্থিতির জন্য কেন উপযুক্ত নয় তা আপনি কী ব্যাখ্যা করতে পারেন?
pkozlowski.opensource

4
@ pkozlowski.opensource এটি অনেক পরিষ্কার er এছাড়াও ইভেন্টগুলি কী সংযুক্ত হতে পারে তার উপর নির্ভর করে এবং সূচীতে আইটেমগুলির জটিলতা আরও বেশি দক্ষ। এছাড়াও $scope.items.splice($scope.items.indexOf(item),1);হিসাবে ডুপ্লিকেট আইটেম জন্য প্রত্যাশিত কাজ করবে না।
মার্টিন

4
@ মার্টিন আপনার আসল সংখ্যা সহ পারফরম্যান্স সম্পর্কিত আপনার দাবির ব্যাক আপ করুন। একটি ফিল্টার প্রতিটি এবং ডাইজেস্ট চক্রের উপর মৃত্যুদন্ড কার্যকর করার বিশাল অসুবিধা হয় তাই আমি মনে করি না এটি সম্পাদন করতে সহায়তা করে ...
pkozlowski.opensource

@ পকোজ্লোস্কি.ওপেনসোর্স এটি সত্য, এবং এটি প্রতি-ডাইজেস্ট চক্রের জন্য দুবার চালিত হয়। গুরুত্বপূর্ণ বিষয়টি হ'ল "ইভেন্টগুলি কী সংযুক্ত হতে পারে তার উপর নির্ভর করে", যখন আপনার হারের কোনও নিয়ন্ত্রণ না থাকে তখন পারফরম্যান্সের বিষয়টি বিবেচনা করে, উদাহরণস্বরূপ, আন-থ্রোটলেড স্ক্রোল ইভেন্ট - চরম ক্ষেত্রে আমি জানি।
মার্টিন

@ মাইল ওয়েল আমার ডুপ্লিকেট রয়েছে এবং এটিই আমি খুঁজছিলাম, কিছুটা দু: খের বিষয় যে অ্যাঙ্গুলার ট্র্যাক বা মূল সূচকটি কোনও able পরিবর্তনশীলে রাখে না। আমি চেষ্টা করেছি (key, item) in itemsএবং এটিও কাজ করে না। (কীটি
মূলতে

4

এটা চেষ্টা কর:

$scope.remove = function(subtask) {

    var idx = $scope.subtasks.indexOf(subtask),
        st = $scope.currentTask.subtasks[idx];

    // remove from DB
    SubTask.remove({'subtaskId': subtask.id});

    // remove from local array
    $scope.subtasks.splice(idx,1);

}

আপনি আমার ব্লগে এই এন্ট্রিটিতে ভার্বোজ ব্যাখ্যাটি খুঁজে পেতে পারেন ।


2

যদি কারও ব্যবহারের প্রয়োজন হয় তবে $indexআপনি বাছাই করা / ফিল্টার করা অ্যারেটিতে একটি নাম দিতে পারেন:

<tr ng-repeat="item in sortedItems = (items | orderBy:'Store.storeName') track by $index">

আমার উত্তর এখানে দেখুন


আমি মনে করি এই উত্তরটি ঠিক আছে, যদি বিশদে অভাব হয়। আমি মনে করি hmk এর অর্থ হ'ল একবারে ফিল্টারড তালিকাটি আলাদা করে রাখা হয়েছে, উপরের মতো, সূচকটি এর বিরুদ্ধে ব্যবহার করা যেতে পারে (যেমন "सॉোর্টড আইটেমস [$ সূচক]") পছন্দসই প্রবেশটি পুনরুদ্ধার করতে।
জেরেমিথফ

1

আমি কেবল একটি মন্তব্য রেখেছি, তবে আমার "খ্যাতি" নেই।

মাইল এর সমাধান ঠিক আমারও প্রয়োজন ছিল। পকোজ্লোস্কি.ওপেনসোর্সের প্রশ্নের উত্তর দেওয়ার জন্য: আপনি যখন নেস্ট করেছেন ngRepeat, তখন একটি গতিশীল তালিকা (যেমন আপনি যেখানে অপসারণের অনুমতি দেন), বা উভয় (যা আমার ক্ষেত্রে) ব্যবহার $indexকরে কাজ করে না কারণ এটি ব্যাক-এন্ডের জন্য ভুল সূচক হবে because বাছাই এবং ব্যবহারের পরে ডেটাngInit মানটি ক্যাশে করার জন্য করা হয় না কারণ তালিকাটি পরিবর্তিত হলে এটি পুনরায় মূল্যায়ন হয় না।

নোট করুন যে মাইলের সমাধানটি সংযুক্ত সূচী সম্পত্তিটির নামটিকে কোনও পরামিতি পেরিয়ে কাস্টমাইজ করতে দেয় <tr ng-repeat="item in items | index:'originalPosition' | orderBy:'Store.storeName'">

আমার টুইটযুক্ত সংস্করণ:

.filter( 'repeatIndex', function repeatIndex()
{
// This filter must be called AFTER 'filter'ing 
//  and BEFORE 'orderBy' to be useful.
    return( function( array, index_name )
    {
        index_name = index_name || 'index';
        array.forEach( function( each, i )
        {each[ index_name ] = i;});
        return( array );
    });
})
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.