• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jak działa ten splice?

Object Storage Arubacloud
+1 głos
600 wizyt
pytanie zadane 20 października 2016 w JavaScript przez Madar Obywatel (1,560 p.)

Witam. Mam pytanie odnośnie działania pewnej apki. Znalazłem ją w sieci i postanowiłem od deski do deski prześledzić jej działanie:

 

<!DOCTYPE html>
<html>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
<body>

<script>
var app = angular.module("myShoppingList", []);
app.controller("myCtrl", function($scope) {
    $scope.products = ["Milk", "Bread", "Cheese"];
    $scope.addItem = function () {
        $scope.errortext = "";
        if (!$scope.addMe) {return;}
        if ($scope.products.indexOf($scope.addMe) == -1) {
            $scope.products.push($scope.addMe);
        } else {
            $scope.errortext = "The item is already in your shopping list.";
        }
    }
    $scope.removeItem = function (x) {
        $scope.errortext = "";
        $scope.products.splice(x, 1);
    }
});
</script>

<div ng-app="myShoppingList" ng-controller="myCtrl">
  <ul>
    <li ng-repeat="x in products">{{x}}<span ng-click="removeItem($index)">×</span></li>
  </ul>
  <input ng-model="addMe">
  <button ng-click="addItem()">Add</button>
  <p>{{errortext}}</p>
</div>

</body>
</html>

Pytanie mam odnośnie splice, a mianowicie tego fragmentu kodu: 
 

    $scope.removeItem = function (x) {
        $scope.errortext = "";
        $scope.products.splice(x, 1);
    }

Jak to działa, że funkcja przekazuje jakiś parametr i kiedy $scope przesyła model do widoku, to przy użyciu ng-click usówa się kliknięty element? Bez przekazania parametru ta funkcja nie wykona się poprawnie. Zrozumienie tego mnie nieco przerasta, więc będę bardzo wdzięczny, jeśli ktoś wytłumaczy mi to w "łopatologiczny" sposób :)

1 odpowiedź

+2 głosów
odpowiedź 20 października 2016 przez ScriptyChris Mędrzec (190,190 p.)
wybrane 20 października 2016
 
Najlepsza
<li ng-repeat="x in products">

https://docs.angularjs.org/api/ng/directive/ngRepeat

Angularowa dyrektywa służąca do iterowania po kolekcjach. Udostępnia ona kilka propertisów, m.in.: $index, który odpowiada za aktualny iterator pętli. Tenże iterator jest przesyłany do funkcji removeItem() podpiętej do $scope kontrolera.

<span ng-click="removeItem($index)">

, dzięki czemu wewnątrz tej funkcji dostępny jest aktualny indeks elementu, w który kliknąłeś.

$scope.removeItem = function (x) {
    $scope.errortext = "";
    $scope.products.splice(x, 1);
}

W funkcji na tablicy products wykonywana jest metoda splice(). Dokonuje ona usunięcia jednego elementu zaczynając od przekazanego indeksu. 

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/splice

array.splice(start[, deleteCount[, item1[, item2[, ...]]]])

Pierwszym parametrem (w funkcji oznaczonym jako x, który jest tym przekazanym iteratorem z dyrektywy ng-repeat) jest numer indeksu w tablicy, od którego chcesz zacząć usuwać elementy. drugim jest ilość usuwanych elementów - w przypadku tej funkcji, jest to jeden element.

komentarz 20 października 2016 przez Madar Obywatel (1,560 p.)
Ahh, rozumiem! Z każdym dniem Angular podoba mi się coraz bardziej! :)
Wielkie dzięki za wyjaśnienie :)
komentarz 20 października 2016 przez ScriptyChris Mędrzec (190,190 p.)

Skoro podoba Ci się coraz bardziej, to proponuję zacząć stosować czytelniejszy sposób tworzenia kodu:

Jeśli chcesz pisać w "starszym" AngularJS (czyli przed wersją 1.5):

https://github.com/johnpapa/angular-styleguide/blob/master/a1/README.md

Jeśli chcesz już pisać na komponentach dostępnych od AngularJS w wersji 1.5 (gdzie wprowadzono Components, aby zbliżyć go do Angulara2):

https://github.com/toddmotto/angular-styleguide

Podobne pytania

+1 głos
1 odpowiedź 246 wizyt
pytanie zadane 6 kwietnia 2021 w JavaScript przez Oskar Szkurłat Bywalec (2,780 p.)
+1 głos
2 odpowiedzi 142 wizyt
pytanie zadane 25 kwietnia 2016 w JavaScript przez Rubeus024 Obywatel (1,680 p.)
0 głosów
1 odpowiedź 128 wizyt
pytanie zadane 5 sierpnia 2020 w Python przez Marak123 Stary wyjadacz (11,190 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...