#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
файла и вызывать их из mycomponent
?
Ответ №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:
- храните объекты в разных файлах (контроллеры, компоненты, службы и т. Д.)
- сохраняйте регистрацию модуля в отдельном файле (uiStuff.module.js в примере)
- попробуйте следовать соглашению об именах 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. правильно. Лучше перенести код контроллера в компонент.