বুটস্ট্র্যাপ ব্যবহার করে কীভাবে এনজি-রিপিট ডেটা বিভক্ত করবেন


122

আমি আমার কোড দিয়ে এনজি-রিপিট ব্যবহার করছি আমার এনজি-রিপিটের উপর ভিত্তি করে পাঠ্য বাক্সের 'এন' নম্বর রয়েছে। আমি তিনটি কলাম দিয়ে পাঠ্যবাক্সটি সারিবদ্ধ করতে চাই।

এটি আমার কোড

<div class="control-group" ng-repeat="oneExt in configAddr.ext">
    {{$index+1}}. 
    <input type="text" name="macAdr{{$index+1}}" 
           id="macAddress" ng-model="oneExt.newValue" value=""/>
</div>

1
সুতরাং ধরে নিচ্ছি আপনার নয়টি (9) আপনি এক সারিতে বা একটি কলামে 1,2,3 চান?
গ্যাব্রিয়েল পেট্রিওলি

উত্তর:


254

সবচেয়ে নির্ভরযোগ্য এবং প্রযুক্তিগতভাবে সঠিক দৃষ্টিভঙ্গি হ'ল নিয়ামকের মধ্যে ডেটা পরিবর্তন করা। এখানে একটি সরল অংশ এবং ব্যবহার রয়েছে।

function chunk(arr, size) {
  var newArr = [];
  for (var i=0; i<arr.length; i+=size) {
    newArr.push(arr.slice(i, i+size));
  }
  return newArr;
}

$scope.chunkedData = chunk(myData, 3);

তারপরে আপনার দৃষ্টিভঙ্গিটি এমন দেখাবে:

<div class="row" ng-repeat="rows in chunkedData">
  <div class="span4" ng-repeat="item in rows">{{item}}</div>
</div>

যদি আপনার মধ্যে কোনও ইনপুট থাকে ng-repeatতবে ডেটা সংশোধিত বা জমা দেওয়ার সময় আপনি সম্ভবত অ্যারেগুলি আনচঙ্ক / পুনরায় যোগদান করতে চাইবেন। এটি কীভাবে এটিতে প্রদর্শিত হবে তা এখানে রয়েছে $watchযাতে ডেটা সর্বদা আসল, মার্জড ফর্ম্যাটে উপলব্ধ থাকে:

$scope.$watch('chunkedData', function(val) {
  $scope.data = [].concat.apply([], val);
}, true); // deep watch

একটি ফিল্টার দিয়ে ভিউতে অনেকে এটি সম্পাদন করতে পছন্দ করেন। এটি সম্ভব, তবে এটি কেবল প্রদর্শনের উদ্দেশ্যে ব্যবহার করা উচিত! আপনি যদি এই ফিল্টার করা দৃশ্যের মধ্যে ইনপুট যুক্ত করেন তবে এটি এমন সমস্যাগুলির কারণ ঘটবে যা সমাধান করা যেতে পারে তবে এটি সুন্দর বা নির্ভরযোগ্য নয়

এই ফিল্টারটির সমস্যা হ'ল এটি প্রতিবার নতুন নেস্টেড অ্যারেগুলি ফিরিয়ে দেয়। কৌণিক ফিল্টার থেকে রিটার্ন মান দেখছে। প্রথমবার ফিল্টারটি সঞ্চালিত হয়, কৌণিক মানটি জানে, তারপরে এটি পরিবর্তন হয়ে যায় তা নিশ্চিত করতে আবার চালায়। উভয় মান একই হলে চক্রটি সমাপ্ত হয়। যদি তা না হয় তবে ফিল্টারটি একই রকম না হওয়া পর্যন্ত বার বার জ্বলতে থাকবে বা অ্যাঙ্গুলার বুঝতে পারে একটি অসীম ডাইজেস্ট লুপটি ঘটছে এবং বন্ধ হয়ে যায়। যেহেতু নতুন নেস্টেড অ্যারে / অবজেক্টগুলি আগে কৌণিক দ্বারা ট্র্যাক করা হয়নি, এটি সর্বদা পূর্বের থেকে পৃথক হিসাবে প্রত্যাবর্তন মানটি দেখে। এই "অস্থির" ফিল্টারগুলি ঠিক করতে, আপনাকে অবশ্যই কোনও memoizeফাংশনে ফিল্টারটি আবৃত করতে হবে । lodashএকটি memoizeফাংশন রয়েছে এবং লড্যাশের সর্বশেষতম সংস্করণেও একটি chunkফাংশন অন্তর্ভুক্ত রয়েছে , তাই আমরা খুব সহজেই ব্যবহার করে এই ফিল্টারটি তৈরি করতে পারিnpmমডিউল এবং সঙ্গে স্ক্রিপ্ট সংকলন browserifyবা webpack

মনে রাখবেন: কেবল প্রদর্শন! আপনি যদি ইনপুট ব্যবহার করেন তবে কন্ট্রোলারে ফিল্টার করুন!

লড্যাশ ইনস্টল করুন:

npm install lodash-node

ফিল্টার তৈরি করুন:

var chunk = require('lodash-node/modern/array/chunk');
var memoize = require('lodash-node/modern/function/memoize');

angular.module('myModule', [])
.filter('chunk', function() {
  return memoize(chunk);
});

এবং এই ফিল্টার সহ এখানে একটি নমুনা রয়েছে:

<div ng-repeat="row in ['a','b','c','d','e','f'] | chunk:3">
  <div class="column" ng-repeat="item in row">
    {{($parent.$index*row.length)+$index+1}}. {{item}}
  </div>
</div>

উল্লম্বভাবে আইটেম অর্ডার করুন

1  4
2  5
3  6

অনুভূমিক (বাম থেকে ডানে) পরিবর্তে উল্লম্ব কলামগুলি (উপরে থেকে নীচে তালিকার তালিকার) বিষয়ে, সঠিক প্রয়োগটি পছন্দসই শব্দার্থবিদ্যার উপর নির্ভর করে। অসমভাবে বিভক্ত তালিকাগুলি বিভিন্ন উপায়ে বিতরণ করা যেতে পারে। এখানে একটি উপায়:

<div ng-repeat="row in columns">
  <div class="column" ng-repeat="item in row">
    {{item}}
  </div>
</div>
var data = ['a','b','c','d','e','f','g'];
$scope.columns = columnize(data, 3);
function columnize(input, cols) {
  var arr = [];
  for(i = 0; i < input.length; i++) {
    var colIdx = i % cols;
    arr[colIdx] = arr[colIdx] || [];
    arr[colIdx].push(input[i]);
  }
  return arr;
}

যাইহোক, কলামগুলি পাওয়ার সর্বাধিক প্রত্যক্ষ এবং সহজভাবে সহজ উপায় হ'ল CSS কলামগুলি ব্যবহার করা :

.columns {
  columns: 3;
}
<div class="columns">
  <div ng-repeat="item in ['a','b','c','d','e','f','g']">
    {{item}}
  </div>
</div>

আপনার সাহায্যের জন্য ধন্যবাদ. কিন্তু কৌণিকর সাথে ইউআই-চার্ট সহ কারাউসেল ব্যবহার করা বিটি কারাউসেল সূচিত চার্ট আঁকতে পারে না। আমার কোডটি <ক্যারোসেল ইন্টারভাল = "মাইআইন্টারওয়াল"> <স্লাইড এনজি-রিপিট = "মাইলস্টোন ইন মাইলফলক | বিভাজন: 4" সক্রিয় = "স্লাইড.এ্যাকটিভ"> <ডি ক্লাস = "কোল-এমডি -3" এনজি-রিপিট = " মাইলস্টোন 1 "মাইলস্টোন 1" <ডি স্টাইল = "পাঠ্য-প্রান্তিককরণ: কেন্দ্র;"> <ডিআইআইআইআই-চার্ট = "ডেটা" চার্ট-বিকল্পগুলি = "চার্টঅ্যাপশনস"> </ ডিভি> </ div> </ div> </ স্লাইড > </carousel> এবং আমি আমার স্কোপ ভেরিয়েবলটি মাইলফলক JSON ডেটা হিসাবে শুরু করেছি।
কুপ্পু

1
@ m59 এখনই এই ফাংশনটি প্রথম সারিতে a b cদ্বিতীয় সারিতে ডেটা প্রদর্শন করছে d e f। আমি কি দ্বিতীয় কলাম এবং তৃতীয় কলামে a b প্রথম কলামে প্রদর্শন করতে পারি ? ধন্যবাদc de f

1
@ Ifch0o1 আপনি যদি সঠিক হন তবে তা সঠিক হতে পারে [].concat.call([], val)। আপনি অবশ্যই বিবেচনা করুন applyvalঅ্যারেগুলির একটি অ্যারে এবং আমরা যুক্তি হিসাবে এটির মধ্যে those অ্যারেগুলির প্রত্যেকটিকেই পাস করতে চাই concat। আমি মনে করি আপনি প্রসঙ্গে মনোনিবেশ করছেন [], যা এখানে মূল বিষয় নয়। আমরা যা চাই তা [].concat(val[1], val[2], val[3], etc)তাই, আমাদের দরকারapply([], val)
m59

1
@ বাহাদির আমি উত্তরটি আরও পরিষ্কার করে আপডেট করেছি। আপনি যদি কোনও ফিল্টার তৈরি করেন যা কেবলমাত্র []বনাম [[]]এবং [{}]। নেস্টেড অ্যারে / অবজেক্টটি কৌণিক প্রত্যেককে আলাদা আলাদা ফলাফল filterদেখায় এবং ফলাফলটি একই (স্থিতিশীল) থাকার জন্য পুনরাবৃত্তি করে চলে ।
m59

1
আপনি মন্তব্যগুলিতে সত্যিই স্প্যাম করছেন :) এটি নিজের জন্য চেষ্টা করুন। var x = [1,2,3]; var y = [1,2,3]; console.log(x === y);গভীর চেকিংয়ের অর্থ হয় স্ট্রিংফাইডিং এবং স্ট্রিংগুলির তুলনা করা, যা ঝুঁকিপূর্ণ কারণ কোনও বস্তু স্ট্রিংফাইয়েবল হতে পারে না, বা প্রতিটি সম্পত্তি পৃথকভাবে চেক করা যায়। আমি মনে করি অ্যাঙ্গুলার ফিল্টারগুলির জন্য এটি বাস্তবায়ন করতে পারে তবে আমি নিশ্চিত যে তারা না করার উপযুক্ত কারণ রয়েছে। সম্ভবত কারণ তারা মূলত কোনও ডেটা-সেটকে সাধারণ পরিবর্তনের জন্য ফিল্টারগুলি চেয়েছিলেন, কাঠামোর পরিবর্তনগুলির সাথে একটি সম্পূর্ণ ওভারহল নয়।
এম 59

64

এই সমাধানটি খুব সহজ:

তাদেরকে JSON:

[{id:"1",name:"testA"},{id:"2",name:"test B"},{id:"3",name:"test C"},{id:"4",name:"test D"},{id:"5",name:"test E"}]

এইচটিএমএল:

<div ng-controller="MyCtrl">
  <table>
    <tr ng-repeat="item in items" ng-switch on="$index % 3">
      <td ng-switch-when="0">
        {{items[$index].id}} {{items[$index].name}}
      </td>
      <td ng-switch-when="0">
        <span ng-show="items[$index+1]">
          {{items[$index+1].id}} {{items[$index+1].name}}
        </span>
      </td>
      <td ng-switch-when="0">
        <span ng-show="items[$index+2]">    
          {{items[$index+2].id}} {{items[$index+2].name}}
        </span>
      </td>
    </tr>
  </table>
</div>

FIDDLE এ ডেমো

এখানে চিত্র বর্ণনা লিখুন


3
সর্বোত্তম উত্তর! এবং দেশীয় নির্দেশাবলীর সাথে যা প্রয়োজন তা করুন! Congratz!
রেনান ফ্রাঙ্কা

1
এই সমাধানটি কার্যকর হয়, তবে সর্বোত্তম অনুশীলনগুলি যতটা যায়, সম্ভবত আপনার মার্কআপে লেআউট সংজ্ঞায়িত করার জন্য টেবিলগুলি ব্যবহার করা উচিত নয় :)
ডেভ কুপার

2
@ ডেভকুপার যেমন উল্লেখ করেছে, এখানে টেবিল ছাড়াই বিকল্প বিন্যাস রয়েছে: plnkr.co/edit/81oj8mHaNyfQpCmRBWO4?p= পূর্বরূপ । ট্যাবুলেটেড ডেটার জন্য টেবিলগুলি বিবেচনা করুন, তবে অন্যথায়, এটি মোবাইল ডিভাইস এবং ভেরিয়েবল স্ক্রিন আকারের জন্য আরও ভাল লেআউট।
জিমোটিক

1
এটি এখন পর্যন্ত সেরা সমাধান is একটি নতুন কাঠামো ব্যবহার করার সময় সমস্ত কৌতূহল খুঁজে পেতে সময় লাগে তবে এনজি-সুইচ একটি গডসেন্ড
জোরান

আপনি যদি কোনও টেবিলের পরিবর্তে ডিভের জন্য যাচ্ছেন তবে আপনি ng-switch-when="0"সমস্ত 3 টি আইটেমের পরিবর্তে একবার বাইরের ডিভিতে রাখতে পারেন।
হ্যান্স ওয়াউটার্স

19

একটি পরিষ্কার, অভিযোজিত সমাধান যা ডেটা ম্যানিপুলেশন প্রয়োজন হয় না :

এইচটিএমএল:

<div class="control-group" class="label"
    ng-repeat="oneExt in configAddr.ext"
    ng-class="{'new-row': startNewRow($index, columnBreak) }">
    {{$index+1}}. 
    <input type="text" name="macAdr{{$index+1}}" 
       id="macAddress{{$index}}" ng-model="oneExt.newValue" />
</div>

সিএসএস:

.label {
    float: left;
    text-align: left;
}
.new-row {
    clear: left;
}

জাভাস্ক্রিপ্ট:

$scope.columnBreak = 3; //Max number of colunms
$scope.startNewRow = function (index, count) {
    return ((index) % count) === 0;
};

সারণি এবং কলামগুলিতে গতিশীলভাবে ডেটা উপস্থাপনের জন্য এটি একটি সহজ সমাধান যা আপনি প্রদর্শনের চেষ্টা করছেন এমন ডেটার অ্যারে হেরফের করার প্রয়োজন নেই। এছাড়াও আপনি ব্রাউজার উইন্ডোটির আকার পরিবর্তন করতে চেষ্টা করলে গ্রিডটি স্ক্রিন / ডিভের আকার অনুসারে গতিশীলরূপে গ্রহণ করতে পারে।

(আমি আপনার আইডিতে একটি $ $ $ সূচক}} প্রত্যয়ও যুক্ত করেছি যেহেতু এনজি-রিপিট একই আইডির সাহায্যে একাধিক উপাদান তৈরি করার চেষ্টা করবে আপনি যদি তা না করেন।)

একটি অনুরূপ কাজের উদাহরণ


1
আমি বিশ্বাস করি যে ওপি টুইটার বুটস্ট্র্যাপ সারি / কলামগুলির জন্য মার্কআপ চেয়েছিল, তবে এটি কারও পক্ষে সহায়ক হতে পারে। তবে আপনাকে নিজের উত্তরে কোড এবং ব্যাখ্যা দেওয়া দরকার put কেবলমাত্র লিঙ্কের উত্তরগুলি সরানো হবে।
m59

@ m59 আপডেট উত্তর। পরামর্শের জন্য ধন্যবাদ
কামিউলো নিম্বাস

1
বড় +1 এর জন্য ডেটা ম্যানিপুলেশন প্রয়োজন হয় না । এটি এনজি-রিপিটকে 2 কলামে বিভক্ত করে স্প্যানের মধ্যে ডেটা আলাদা করার জন্য আমার প্রয়োজনের জন্য নিখুঁত কাজ করেছে যাতে আমার বুটস্ট্র্যাপ মডেলটি এত দীর্ঘ না হয়! আমি অবাক হয়েছি বাস্তবায়নে এটি কতটা সহজ! <span ng-repeat="z in waiverModalLinks" ng-class="{'new-row':startNewRow($index, columnBreak)}" class="{{z.id}}"><a href="{{z.link}}{{z.title}}">{{z.title}}</a></span>এটি 'মডেল-বডি' এর ভিতরে।
ক্রিস্টিন

15

এম 59 এর উত্তরটি বেশ ভাল। আমি যে জিনিসটি সম্পর্কে এটি পছন্দ করি না তা হ'ল এটি divকোনও টেবিলের জন্য ডেটা হতে পারে এমনটি ব্যবহার করে।

সুতরাং এম 59 এর ফিল্টারের সাথে মিলিয়ে (উপরে কোথাও উত্তর দিন), এখানে এটি কীভাবে একটি টেবিলের মধ্যে প্রদর্শন করবেন।

<table>
    <tr class="" ng-repeat="rows in foos | chunk:2">
        <td ng-repeat="item in rows">{{item}}</td>
    </tr>
</table>

7

নিম্নলিখিত আরও সহজ উপায়:

<table>
    <tr ng-repeat="item in lists" ng-hide="$index%2!==0">
        <td>
            <label>{{ lists[$index].name}}</label>
        </td>
        <td ng-hide="!lists[$index+1]">
            <label>{{ lists[$index+1].name}}</label>
        </td>
    </tr>
</table>

কামুলো নিম্বাসের উত্তরটি আমার পক্ষে কার্যকর তবে আমি এই গ্রিডটি একটি ডিভ দ্বারা আবৃত করতে চাই যা তালিকাটি দীর্ঘ দীর্ঘ হলে স্ক্রোলবারটি প্রদর্শন করতে পারে।

এটি অর্জনের জন্য আমি style="height:200px; overflow:auto"টেবিলের চারপাশে একটি ডিভ যুক্ত করেছি যার কারণে এটি একক কলাম হিসাবে দেখাবে।

এখন একের অ্যারের দৈর্ঘ্যের জন্য কাজ করে।


অ্যারেতে কেবল 1 টি আইটেম থাকলে এটি প্রথম সারিটি প্রদর্শন করবে না। এই পরিবর্তনটি ঠিক করতে ng-hide="$index%2!==0"
অনুজ পান্ডে

4

আমার একটি ফাংশন রয়েছে এবং এটি একটি পরিষেবাতে সঞ্চিত করেছি যাতে আমি এটিকে আমার অ্যাপ্লিকেশনে ব্যবহার করতে পারি:

সার্ভিস:

app.service('SplitArrayService', function () {
return {
    SplitArray: function (array, columns) {
        if (array.length <= columns) {
            return [array];
        };

        var rowsNum = Math.ceil(array.length / columns);

        var rowsArray = new Array(rowsNum);

        for (var i = 0; i < rowsNum; i++) {
            var columnsArray = new Array(columns);
            for (j = 0; j < columns; j++) {
                var index = i * columns + j;

                if (index < array.length) {
                    columnsArray[j] = array[index];
                } else {
                    break;
                }
            }
            rowsArray[i] = columnsArray;
        }
        return rowsArray;
    }
}

});

নিয়ন্ত্রক:

$scope.rows   = SplitArrayService.SplitArray($scope.images, 3); //im splitting an array of images into 3 columns

মার্কআপ:

 <div class="col-sm-12" ng-repeat="row in imageRows">
     <div class="col-sm-4" ng-repeat="image in row">
         <img class="img-responsive" ng-src="{{image.src}}">
     </div>
 </div>

এটি দুর্দান্ত হলেও, অন্যান্য ফিল্টারগুলি যেমন অর্ডারবাই বা ফিল্টার ব্যবহার করার সময় এটি কোনও লাভ করে না।
রবি স্মিথ

2

আমার পদ্ধতির জিনিসগুলির মিশ্রণ ছিল।

আমার উদ্দেশ্যটি ছিল গ্রিডটি পর্দার আকারের সাথে খাপ খাইয়ে নেওয়া। আমি 3 কলাম চেয়েছিলেন lg, 2 কলাম smএবং md, এবং আরও 1 জন্য কলাম xs

প্রথমত, আমি কৌনিক $windowপরিষেবা ব্যবহার করে নিম্নলিখিত স্কোপ ফাংশনটি তৈরি করেছি :

$scope.findColNumberPerRow = function() {
    var nCols;
    var width = $window.innerWidth;

    if (width < 768) {
        // xs
        nCols = 1;
    }
    else if(width >= 768 && width < 1200) {
         // sm and md
         nCols = 2
    } else if (width >= 1200) {
        // lg
        nCols = 3;
    }
    return nCols;
};

তারপরে, আমি @ কুমুলো নিম্বাস দ্বারা প্রস্তাবিত শ্রেণিটি ব্যবহার করেছি:

.new-row {
    clear: left;
}

ধারণকারী DIV আছে ইন ng-repeat, আমি যোগ resizableনির্দেশ হিসাবে ব্যাখ্যা, এই পৃষ্ঠার , যাতে প্রত্যেক সময় উইন্ডো পুনরায় আকার কৌণিক হয় $windowসেবা নতুন মান দিয়ে আপডেট করা হয়।

শেষ পর্যন্ত, আমি বারবার ডিভ এ:

ng-repeat="user in users" ng-class="{'new-row': ($index % findColNumberPerRow() === 0) }"

দয়া করে, এই পদ্ধতির কোনও ত্রুটি আমাকে জানান।

আশা করি এটি সহায়ক হতে পারে।


2

বুটস্ট্র্যাপ দ্বারা প্রস্তাবিত "ক্লিয়ারফিক্স" সিএসএস সহ একটি সহজ কৌশল:

<div class="row">
      <div ng-repeat-start="value in values" class="col-md-4">
        {{value}}
      </div>
      <div ng-repeat-end ng-if="$index % 3 == 0" class="clearfix"></div>
</div>

অনেক সুবিধা: দক্ষ, দ্রুত, বুস্টারপ সুপারিশ ব্যবহার করে, সম্ভাব্য $ সমস্যাগুলি হজম করা এবং কৌণিক মডেলকে পরিবর্তন না করা।


1

এই উদাহরণটি একটি নেস্টেড রিপিটার তৈরি করে যেখানে বাইরের ডেটাতে একটি অভ্যন্তরীণ অ্যারে অন্তর্ভুক্ত থাকে যা আমি দুটি কলামে তালিকাবদ্ধ করতে চেয়েছিলাম। ধারণাটি তিন বা ততোধিক কলামের জন্য সত্য হবে।

অভ্যন্তরীণ কলামে সীমাটি না হওয়া পর্যন্ত আমি "সারি" পুনরাবৃত্তি করি। এই ক্ষেত্রে দুটি দ্বারা কাঙ্ক্ষিত কলামগুলির সংখ্যা দ্বারা আইটেমগুলির অ্যারের দৈর্ঘ্য ভাগ করে সীমা নির্ধারণ করা হয়। বিভাগ পদ্ধতিটি নিয়ামকের উপর বসে এবং প্যারামিটার হিসাবে বর্তমান অ্যারে দৈর্ঘ্যটি পাস করে। জাভাস্ক্রিপ্ট স্লাইস (0, অ্যারে। দৈর্ঘ্য / কলামকাউন্ট) ফাংশনটি পুনরাবৃত্তির ক্ষেত্রে সীমাটি প্রয়োগ করে।

এরপরে দ্বিতীয় কলামের পুনরাবৃত্তিকে অনুরোধ করা হয় এবং স্লাইস পুনরায় পুনরুক্ত করা হয় (অ্যারে.লেন্থ / কলামকাউন্ট, অ্যারে.লেন্থ) যা কলাম দুটিতে অ্যারের দ্বিতীয় অর্ধেক উত্পাদন করে।

<div class="row" ng-repeat="GroupAccess in UsersController.SelectedUser.Access" ng-class="{even: $even, odd: $odd}">
    <div class="col-md-12 col-xs-12" style=" padding-left:15px;">
        <label style="margin-bottom:2px;"><input type="checkbox" ng-model="GroupAccess.isset" />{{GroupAccess.groupname}}</label>
    </div>
    <div class="row" style=" padding-left:15px;">
        <div class="col-md-1 col-xs-0"></div>
        <div class="col-md-3 col-xs-2">
            <div style="line-height:11px; margin-left:2px; margin-bottom:2px;" ng-repeat="Feature in GroupAccess.features.slice(0, state.DivideBy2(GroupAccess.features.length))">
                <span class="GrpFeature">{{Feature.featurename}}</span>
            </div>
        </div>
        <div class="col-md-3 col-xs-2">
            <div style="line-height:11px; margin-left:2px; margin-bottom:2px;" ng-repeat="Feature in GroupAccess.features.slice( state.DivideBy2(GroupAccess.features.length), GroupAccess.features.length )">
                <span class="GrpFeature">{{Feature.featurename}}</span>
            </div>
        </div>
        <div class="col-md-5 col-xs-8">
        </div>
    </div>
</div>


// called to format two columns
state.DivideBy2 = function(nValue) {
    return Math.ceil(nValue /2);
};

আশা করি এটি সমাধানটিকে অন্য কোনও উপায়ে দেখতে সহায়তা করবে। (পিএস এটি এখানে আমার প্রথম পোস্ট! :-))


1

আমি .ro ছাড়াই ঠিক করে দিই

<div class="col col-33 left" ng-repeat="photo in photos">
   Content here...
</div>

এবং সিএসএস

.left {
  float: left;
}

1

এটি করার সহজ-উপায় এখানে। এটি আরও ম্যানুয়াল এবং অগোছালো মার্কআপের সাথে শেষ। আমি এটি প্রস্তাব দিচ্ছি না, তবে এমন পরিস্থিতি রয়েছে যেখানে এটি কার্যকর হতে পারে।

এখানে একটি মজাদার লিঙ্ক http://jsfiddle.net/m0nk3y/9wcbpydq/

এইচটিএমএল:

<div ng-controller="myController">
    <div class="row">
        <div class="col-sm-4">
            <div class="well">
                <div ng-repeat="person in people = data | limitTo:Math.ceil(data.length/3)">
                {{ person.name }}
                </div>
            </div>
        </div>
        <div class="col-sm-4">
            <div class="well">
                <div ng-repeat="person in people = data | limitTo:Math.ceil(data.length/3):Math.ceil(data.length/3)">
                {{ person.name }}
                </div>
            </div>
        </div>
        <div class="col-sm-4">
            <div class="well">
                <div ng-repeat="person in people = data | limitTo:Math.ceil(data.length/3):Math.ceil(data.length/3)*2">
                {{ person.name }}
                </div>
            </div>
        </div>
    </div>
</div>

জাতীয়:

var app = angular.module('myApp', []);

app.controller('myController', function($scope) {

    $scope.Math = Math;
    $scope.data = [
        {"name":"Person A"},
        ...
    ];
});

এই সেটআপটির জন্য আমাদের মার্কআপে কিছু ম্যাথ ব্যবহার করা প্রয়োজন: /, সুতরাং আপনাকে এই লাইনটি যুক্ত করে ম্যাথটি ইনজেক্ট করতে হবে: $scope.Math = Math;


1

এই উত্তরগুলির সমস্তগুলি ইঞ্জিনিয়ারডের উপর বৃহত্তর মনে হচ্ছে।

এখন পর্যন্ত সবচেয়ে সহজ পদ্ধতিটি হ'ল একটি কল-এমডি -4 কলাম বুটস্ট্র্যাপে ইনপুট ডিভগুলি সেটআপ করা হবে, তারপরে বুটস্ট্র্যাপের 12 কলামের প্রকৃতির কারণে বুটস্ট্র্যাপ এটিকে স্বয়ংক্রিয়ভাবে 3 কলামে ফর্ম্যাট করবে:

<div class="col-md-12">
    <div class="control-group" ng-repeat="oneExt in configAddr.ext">
        <div class="col-md-4">
            <input type="text" name="macAdr{{$index}}"
                   id="macAddress" ng-model="oneExt.newValue" value="" />
        </div>
    </div>
</div>

1
<div class="row">
  <div class="col-md-4" ng-repeat="remainder in [0,1,2]">
    <ul>
      <li ng-repeat="item in items" ng-if="$index % 3 == remainder">{{item}}</li>
    </ul>
  </div>
</div>

0

এম 59 এর খুব ভাল উত্তর বন্ধ করে দেওয়া। আমি দেখতে পেয়েছি যে মডেল ইনপুটগুলি পরিবর্তন হলে তা ঝাপসা হয়ে যাবে, সুতরাং আপনি একবারে কেবল একটি চরিত্র পরিবর্তন করতে পারেন। এটি যার প্রয়োজন হয় তার জন্য অবজেক্টের তালিকার জন্য এটি একটি নতুন:

এক পৃষ্ঠায় একাধিক ফিল্টার পরিচালনা করতে সম্পাদনা আপডেট করা হয়েছে

app.filter('partition', function() {
  var cache = {}; // holds old arrays for difference repeat scopes
  var filter = function(newArr, size, scope) {
    var i,
      oldLength = 0,
      newLength = 0,
      arr = [],
      id = scope.$id,
      currentArr = cache[id];
    if (!newArr) return;

    if (currentArr) {
      for (i = 0; i < currentArr.length; i++) {
        oldLength += currentArr[i].length;
      }
    }
    if (newArr.length == oldLength) {
      return currentArr; // so we keep the old object and prevent rebuild (it blurs inputs)
    } else {
      for (i = 0; i < newArr.length; i += size) {
        arr.push(newArr.slice(i, i + size));
      }
      cache[id] = arr;
      return arr;
    }
  };
  return filter;
}); 

এবং এটি ব্যবহার হবে:

<div ng-repeat="row in items | partition:3:this">
  <span class="span4">
    {{ $index }}
  </span>
</div>

আমি যতটুকু বলতে পারি, এটি বেশিরভাগ সময় কাজ করা উচিত তবে ক্যাশে যুক্তি পুরোপুরি নির্ভরযোগ্য বলে মনে হয় না এবং সুযোগটি পাস করা অদ্ভুত। যখন ইনপুটগুলি প্রয়োজন হয় তখন আমি সত্যিই নিয়ন্ত্রণকারীর মধ্যে কেবল ফিল্টারিংয়ের পরামর্শ দিই। এটি যাইহোক প্রযুক্তিগতভাবে সঠিক পন্থা।
m59

0

আমি বুটস্ট্র্যাপ এবং অ্যাঙ্গুলারজগুলিতে নতুন, তবে এটি প্রতি গ্রুপ হিসাবে 4 টি আইটেমকেও অ্যারে করতে পারে, ফলাফলটি প্রায় 3 টি কলাম পছন্দ করবে। এই কৌশলটি বুটস্ট্র্যাপ ব্রেক ব্রেক লাইনের নীতি ব্যবহার করে।

<div class="row">
 <div class="col-sm-4" data-ng-repeat="item in items">
  <div class="some-special-class">
   {{item.XX}}
  </div>
 </div>
</div>

0

লোড্যাশের এখন একটি অভ্যন্তরীণ পদ্ধতি রয়েছে যা আমি ব্যক্তিগতভাবে ব্যবহার করি: https://lodash.com/docs#chunk

এর ভিত্তিতে, কন্ট্রোলার কোডটি নিম্নলিখিতগুলির মতো দেখতে পারে:

$scope.groupedUsers = _.chunk( $scope.users, 3 )

কোড দেখুন:

<div class="row" ng-repeat="rows in groupedUsers">
  <div class="span4" ng-repeat="item in rows">{{item}}</div>
</div>

0

আর একটি উপায় এইভাবে width:33.33%; float:leftএকটি মোড়ক ডিভিতে সেট করা আছে:

<div ng-repeat="right in rights" style="width: 33.33%;float: left;">
    <span style="width:60px;display:inline-block;text-align:right">{{$index}}</span>
    <input type="number" style="width:50px;display:inline-block" ">
</div>

0

আমি নিজেকে একটি অনুরূপ ক্ষেত্রে পেয়েছি, প্রতিটিতে 3 টি কলামের প্রদর্শন গ্রুপ তৈরি করতে চাইছি। যাইহোক, যদিও আমি বুটস্ট্র্যাপ ব্যবহার করছি, আমি এই গোষ্ঠীগুলিকে বিভিন্ন প্যারেন্ট ডিভগুলিতে আলাদা করার চেষ্টা করছিলাম। আমি কিছু উদারভাবে দরকারী করতে চেয়েছিলেন।

আমি ng-repeatনীচে হিসাবে এটি 2 সাথে যোগাযোগ :

<div ng-repeat="items in quotes" ng-if="!($index % 3)">
  <div ng-repeat="quote in quotes" ng-if="$index <= $parent.$index + 2 && $index >= $parent.$index">
                ... some content ...
  </div>
</div>

এটি বিভিন্ন সংখ্যা কলামে পরিবর্তন করা খুব সহজ করে তোলে এবং বেশ কয়েকটি প্যারেন্ট ডিভগুলিতে বিভক্ত হয়ে যায়।


0

কেবলমাত্র কেউ যদি একটি কৌণিক 7 (এবং উচ্চতর সংস্করণ) চায় তবে এখানে উদাহরণ হিসাবে আমি আমার অ্যাপ্লিকেশনগুলির একটিতে ব্যবহার করেছি:

এইচটিএমএল:

                   <div class="container-fluid">
                    <div class="row" *ngFor="let reports of chunkData; index as i">
                        <div *ngFor="let report of reports" class="col-4 col-sm-4"
                            style="border-style:solid;background-color: antiquewhite">{{report}}</div>
                    </div>
                </div>

.TS ফাইল

export class ConfirmationPageComponent implements OnInit {
  chunkData = [];
  reportsArray = ["item 1", "item 2", "item 3", "item 4", "item 5", "item 6"];
  
  constructor() {}

  ngOnInit() {
    this.chunkData = this.chunk(this.reportsArray, 3);
  }

  chunk(arr, size) {
    var newArr = [];
    for (var i = 0; i < arr.length; i += size) {
      newArr.push(arr.slice(i, i + size));
    }
    return newArr;
  }
}

ডাটাবেস থেকে আপনার পুনরাবৃত্তি কত আইটেমের উপর নির্ভর করে ডায়নামিকভাবে নতুন কলাম / সারি তৈরির জন্য এটি দুর্দান্ত একটি সমাধান। ধন্যবাদ!


-1

এটি মূল প্রশ্নের উত্তর দেয় যা কীভাবে একটি কলামে 1,2,3 পাবেন। - কুপ্পু 8 ফেব্রুয়ারী '14 এ 13:47 এ জিজ্ঞাসা করেছেন

কৌণিক সংক্রান্ত কোড:

function GetStaffForFloor(floor) {
    var promiseGet = Directory_Service.getAllStaff(floor);
    promiseGet.then(function (pl) {
        $scope.staffList = chunk(pl.data, 3); //pl.data; //
    },
    function (errorOD) {
        $log.error('Errored while getting staff list.', errorOD);
    });
}
function chunk(array, columns) {
    var numberOfRows = Math.ceil(array.length / columns);

    //puts 1, 2, 3 into column
    var newRow = []; //array is row-based.
    for (var i = 0; i < array.length; i++) {
        var columnData = new Array(columns);
        if (i == numberOfRows) break;
        for (j = 0; j < columns; j++)
        {
            columnData[j] = array[i + numberOfRows * j];
        }
        newRow.push(columnData); 
    }
    return newRow;

    ////this works but 1, 2, 3 is in row
    //var newRow = [];
    //for (var i = 0; i < array.length; i += columns) {
    //    newRow.push(array.slice(i, i + columns)); //push effectively does the pivot. array is row-based.
    //}
    //return newRow;
};

কোড দেখুন (দ্রষ্টব্য: বুটস্ট্র্যাপ 3 ব্যবহার করে):

<div class="staffContainer">
    <div class="row" ng-repeat="staff in staffList">
        <div class="col-md-4" ng-repeat="item in staff">{{item.FullName.length > 0 ? item.FullName + ": Rm " + item.RoomNumber : ""}}</div>
    </div>
</div>

-1

এই কোডটি এলজি এবং এমডি মোডে তিনটি কলাম, এসএম মোডে দুটি কলাম এবং একক কলামটি এক্স মোডে এলিমেন্টগুলিকে সারিবদ্ধ করতে সহায়তা করবে

<div class="row">
<div ng-repeat="oneExt in configAddr.ext">
    <div class="col-xs-12 col-sm-6 col-md-4 col-lg-4">
        {$index+1}}. 
        <input type="text" name="macAdr{{$index+1}}" 
       id="macAddress" ng-model="oneExt.newValue" value=""/>
    </div>
</div>

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.