Я хочу использовать этот пример кода Plunker для динамического добавления некоторых элементов на HTML-страницу с помощью AngularJS. (Вы должны запустить его по новой ссылке, а не в среде редактора). Это мой первый опыт в объявлении директивы AngularJS (за исключением простых тестов). У меня есть два вопроса по этому образцу:
Controller as
не $Scope
в моих контроллерах. (Я не знаю названия этого подхода!) Итак, что мне делать с примером кода выше? поскольку он использует $compile(...)($scope)
. какие изменения следует применять? 1) Когда используется contrller как синтаксис, поэтому для $compile(...)($scope)
изменится на $compile(...)(vm)
. а также для всех функций и переменных вместо $ scope использовать vm
или this
var vm = this;
поэтому вместо $scope.list
использовать vm.list
и для функции также использовать.
$scope.do = function() ..
vm.do = function() ....
2) В директиве add controllerAs
нравится это
app.directive('myDirective', function () {
return {
scope: {},
controller: function () {
this.name = 'Elnaz'
},
controllerAs: 'ctrl',
template: '<div>{{ctrl.name}}</div>'
};
});
и если вы хотите обратиться к внешнему контроллеру, используйте это
app.directive('myDirective', function () {
return {
restrict: 'A',
controller: 'EmployeeController',
controllerAs: 'ctrl',
template: ''
};
});
на ваш взгляд, измените вот так:
<div ng-controller="myController as ctrl">
{{ctrl.name}}
<button type="button" ng-click="ctrl.do()">Do</button>
</div>
Изменение: работает демонстрация
Ответ на ваш первый вопрос:
Внутри вашего контроллера вы создали бы одну переменную, которая будет представлять собой "контроллер как";
var vm = this;
Теперь все свойства, привязанные к $ scope, теперь будут частью vm
<div ng-controller="customCntrl as vm"
В директиве: Способ связывания контроллера с "контроллером как":
app.directive('customDir', function() {return {controller: 'customCntrl', controllerAs: 'vm',...
}
});
}
});
Answer to your 2nd point: Ответьте на второй пункт:
You can still apply broadcast and emit over 'vm' like this: Вы все же можете использовать трансляцию и излучать по 'vm' следующим образом:
$scope.$watch('vm.name', function() { $scope.$broadcast('topic-123', 'msg'); }); $ scope. $ watch ('vm.name', function() {$ scope. $ broadcast ('topic-123', 'msg');});
И захватить его: $ scope. $ On ('topic-123', function (event, msg) {});