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

Jak działa ten splice?

+1 głos
694 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ź 345 wizyt
pytanie zadane 6 kwietnia 2021 w JavaScript przez Oskar Szkurłat Bywalec (2,780 p.)
+1 głos
2 odpowiedzi 209 wizyt
pytanie zadane 25 kwietnia 2016 w JavaScript przez Rubeus024 Obywatel (1,680 p.)
0 głosów
1 odpowiedź 199 wizyt
pytanie zadane 5 sierpnia 2020 w Python przez Marak123 Stary wyjadacz (11,190 p.)

93,427 zapytań

142,421 odpowiedzi

322,649 komentarzy

62,787 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...