iNickolay
@iNickolay

В чём отличия $scope от this?

Пробую разобраться с ui-sortable.
Возникла не очень понятная ситуация: изучаю ангуляр по codeschool, там везде используется this, а в гуглении всегда попадается $scope.
Почему при таком коде:
html:
<body ng-controller="TestSortableController as SortCtrl">

<ul id="list_1" class="list_1"  ui-sortable="list1Options" ng-model="SortCtrl.list1">
    <li class="app" ng-repeat="app in SortCtrl.list1">  {{ app.name }}  </li>
</ul>

<ul id="list_2" class="list_2"  ui-sortable="list2Options" ng-model="SortCtrl.list2">
    <li class="app"  ng-repeat="app in SortCtrl.list2">  {{ app.name }} </li>
</ul>

</body>


js:
(function () {
    var app = angular.module('testSortable', ['ui.sortable']);

    app.controller('TestSortableController', function () {

        this.list1 = [
            {
                name: "first name",
                type: "second type"
            }, {
                name: "second name",
                type: "third type"
            }
        ];

        this.list2 = [
            {
                name: "another name",
                type: "another type"
            },{
                name: "another second name",
                type: "another second type"
            },
        ];

        this.list1Options = {
            placeholder: 'app',
            connectWith: '.list_2'
        };
        this.list2Options = {};
    });

})();


списки li перетаскиваются только в родительском ul, но стоит заменить this на $scope и убрать SortCtrl.%list%:

html:
<body ng-controller="TestSortableController">

<ul id="list_1" class="list_1"  ui-sortable="list1Options" ng-model="list1">
    <li class="app" ng-repeat="app in list1">  {{ app.name }}  </li>
</ul>

<ul id="list_2" class="list_2"  ui-sortable="list2Options" ng-model="list2">
    <li class="app"  ng-repeat="app in list2">  {{ app.name }} </li>
</ul>

</body>


js:
(function () {
    var app = angular.module('testSortable', ['ui.sortable']);

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

        $scope.list1 = [
            {
                name: "second name",
                type: "third type"
            }, {
                name: "third name",
                type: "fourth type"
            }
        ];

        $scope.list2 = [
            {
                name: "another name",
                type: "another type"
            },{
                name: "another second name",
                type: "another second type"
            },
        ];

        $scope.list1Options = {
            placeholder: 'app',
            connectWith: '.list_2'
        };
        $scope.list2Options = {};
    });
})();


Как всё начинает работать в точности как надо.
Кто-нибудь может объяснить почему так получилось, и где мне в будущем использовать $scope, а где this? (и надо ли?)

Прошу прощения за длиннокод, надеюсь поможете ;(
  • Вопрос задан
  • 378 просмотров
Решения вопроса 2
Чтобы заработал первый вариант попробуйте
...
<ul id="list_1" class="list_1"  ui-sortable="SortCtrl.list1Options" ng-model="list1">
...
<ul id="list_2" class="list_2"  ui-sortable="SortCtrl.list2Options" ng-model="list2">


А вообще, прочитайте про controllerAs, там про это все должно быть написано.
Ответ написан
В будущем $scope нужно использовать нигде, по возможности. $scope использовали до тех пор, пока не появился синтаксис "controller as" https://docs.angularjs.org/api/ng/directive/ngCont... искать на странице фразу "Using controller as makes it obvious which controller you are accessing".

1) На том же codeschool есть BP по яваскрипту + есть хорошие статьи как писать поддерживаемые, быстрые приложения на ангуляр
https://github.com/rwwagner90/angular-styleguide-es6
https://www.sitepoint.com/writing-angularjs-apps-u...

Тут хороший бойлер плейт для ES6 и ангуляр
https://github.com/casufi/NG6-starter
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы