использование компонента или использование отдельного контроллера

#angularjs

#angularjs

Вопрос:

Следуя руководству Angular 1.5, они были controller завернуты следующим component() образом

 angular.
module('myList').
component('myList', {
  templateUrl: 'template.html',
  controller: ['MyList',
    function MyController($scope){
      var self = this;
      $scope.get({
        id : '0'
      }).then(function(response){
        return self.contents;
      })
    }
  ]
});
  

Чтобы подготовиться к переходу Angular2 , какова наилучшая практика с точки зрения размещения controller в собственном js файле?
Должен ли я следовать этому примеру или я должен разделить этот код на 2 файла из-за беспокойства?

примечание: я только что понял component() , что класс вышел в прошлом году 1.5 , и я был введен в заблуждение учебными пособиями до этого выпуска.

Комментарии:

1. вы можете использовать их как функцию конструктора и создавать экземпляры в своих соответствующих классах / компонентах.

2. @user32 вы хотите сказать, чтобы создавать функции внутри controller файла и вызывать их из my component ?

Ответ №1:

Я бы посоветовал вам сохранять свои объекты в разных файлах даже module при регистрации элементов. Позвольте мне объяснить на простом примере:

Давайте представим, что у вас есть какой-то больший модуль с пользовательским module('uiStuff') интерфейсом. Поэтому я предлагаю такую структуру:

uiStuff (папка)

  • uiStuff.module.js
  • uiStuff.service.js

    myList (папка)

    • myList.component.js
    • myList.controller.js
    • myList.partial.html

Ваши файлы модулей всегда будут содержать только регистрацию объектов angular — сервисов, компонентов, директив и т. Д. В будущем это даст вам некоторые преимущества, потому что в Angular2 нет необходимости в этом коде, и вы сможете легко избавиться от этих файлов.

Пример uiStuff.module.js :

 angular.module('uiStuff')
  .service('someService', SomeService)
  .component('myList', myListComponent);
  

Где SomeService — конструктор некоторой функции, и myListComponent является объектом компонента. Давайте посмотрим ниже myList.component.js:

 var myListComponent = {
    bindings: {
       variable:'<'
    },
    templateUrl: 'myList.partial.html',
    controller: MyController
    // and all other component settings
}
  

И точно так же контроллеры и HTML-шаблоны, просто отдельные файлы. Конечно, на мой взгляд, с учетом миграции лучше переключиться на язык TypeScript, это многое упростит для вас.

ВЫВОД: но в любом случае моя точка зрения является общей как для стратегий миграции es5, es6, так и для TypeScript AngularJS:

  1. храните объекты в разных файлах (контроллеры, компоненты, службы и т. Д.)
  2. сохраняйте регистрацию модуля в отдельном файле (uiStuff.module.js в примере)
  3. попробуйте следовать соглашению об именах Angular2 ( name.service.js и name.component.js т.д.)

Ответ №2:

Я предполагал, что: /* в mylist.controller.js */

    function MyController($scope){
     //your code
    }
  

Теперь, на мой взгляд / Component,

 declare var MyController:any;

@Component({
    selector: 'app-elem',
    templateUrl: 'test.html'
})

export class MyComponent {  
  new MyController(this)
}
  

здесь есть несколько предложений,http://blog.rangle.io/upgrade-your-application-to-angular-2-with-ng-upgrade /

Комментарии:

1. Это просто мысль.

2. Нет причин для таких странных вещей, как export class MyComponent { new MyController(this) } . Класс компонента — это класс контроллера. И $scope не может быть просто заменен this .

3. то, что я пытаюсь сделать, это передать контекст класса контроллеру. есть какие-либо обходные пути?

4. Почему? MyController должно просто стать MyComponent . Класс должен быть переработан для использования this вместо $scope свойств области видимости, это хорошая практика для компонентов A1. Невозможно избавиться от $scope событий области видимости и наблюдателей, это будет предметом рефакторинга для миграции с A1 на A2.

5. правильно. Лучше перенести код контроллера в компонент.