Я стараюсь, чтобы директивы были угловатыми. Я пытался использовать переменные со значениями внутри директивы, которая объявляется с использованием this
или var Vm = this
. Но значение переменной не отображается.
Когда я пытаюсь вызвать переменную внутри директивы. Это происходит, когда scope: {}
вызывается в объявлении директивы.
Я прикрепляю код контроллера и директиву:
контроллер (код js)
(function() {
'use strict';
angular
.module('serviceApp')
.controller('ServiceCtrl', ServiceCtrl);
ServiceCtrl.$inject = ['$scope', 'serviceService'];
function ServiceCtrl($scope, serviceService) {
var Vm = this;
Vm.square = function() {
Vm.result = serviceService.square(Vm.number);
};
// $scope.naomi = { name: 'Naomi', address: '1600 Amphitheatre' };
// $scope.igor = { name: 'Igor', address: '123 Somewhere' };
}
})();
директивный код
(function() {
'use strict';
angular
.module('serviceApp')
.directive('sampleDir', sampleDir);
function sampleDir() {
return {
restrict: 'EA',
scope: {
},
templateUrl: "views/directive-template.html"
};
}
})();
Когда я использую переменную result под шаблоном html, вызывая ее из контроллера, она отображает значение.
<div ng-controller="ServiceCtrl as ser">
<label for="num">Enter the number:</label>
<input type="text" id="num" ng-model="ser.number" ng-keyup="ser.square();">
<button>x2</button>
<p>Result: {{ser.result}}</p>
<div>
<sample-dir></sample-dir>
</div>
</div>
шаблон директивы
<p>Square of the number is <strong>{{ser.result}}</strong></p>
Пожалуйста, любая помощь по этому поводу очень ценится.
Когда вы задаете scope: {}
, она создает isolated scope
(что означает отсутствие доступа к родительским областям) и не содержит в ней каких-либо элементов. Таким образом, вы не можете получить доступ к result
в controller
.
В вашем случае вы можете использовать scope: true
и использовать свой шаблон, как вы это сделали, или изменить область действия на этот
scope: {
result: '='
};
и в шаблоне
<sample-dir result='ser.result'></sample-dir>
Это будет шаблон директивы.
<p>Square of the number is <strong>{{result}}</strong></p>
Подробнее см. Здесь Создание пользовательских директив
Это любезно измененный пример с scope: {}
angular.module('serviceApp', []).controller('ServiceCtrl', ServiceCtrl);
ServiceCtrl.$inject = ['$scope'];
function ServiceCtrl($scope) {
var Vm = this;
Vm.number = 0;
Vm.square = function () {
Vm.result = Vm.number * Vm.number;
};
// $scope.naomi = { name: 'Naomi', address: '1600 Amphitheatre' };
// $scope.igor = { name: 'Igor', address: '123 Somewhere' };
}
angular .module('serviceApp').directive('sampleDir', sampleDir);
function sampleDir() {
return {
restrict: 'EA',
scope: {
result: '='
},
template: '<p>Square of the number is <strong>{{result}}</strong></p>'
};
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app='serviceApp' ng-controller="ServiceCtrl as ser">
<label for="num">Enter the number: </label>
<input type="text" id="num" ng-model="ser.number" ng-keyup="ser.square();">
<button>x2</button>
<p>Result: {{ser.result}}</p>
<div>
<sample-dir result='ser.result'></sample-dir>
</div>
Это любезно измененный пример с scope: true
angular.module('serviceApp', []).controller('ServiceCtrl', ServiceCtrl);
ServiceCtrl.$inject = ['$scope'];
function ServiceCtrl($scope) {
var Vm = this;
Vm.number = 0;
Vm.square = function () {
Vm.result = Vm.number * Vm.number;
};
// $scope.naomi = { name: 'Naomi', address: '1600 Amphitheatre' };
// $scope.igor = { name: 'Igor', address: '123 Somewhere' };
}
angular .module('serviceApp').directive('sampleDir', sampleDir);
function sampleDir() {
return {
restrict: 'EA',
scope: true,
template: '<p>Square of the number is <strong>{{ser.result}}</strong></p>'
};
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app='serviceApp' ng-controller="ServiceCtrl as ser">
<label for="num">Enter the number: </label>
<input type="text" id="num" ng-model="ser.number" ng-keyup="ser.square();">
<button>x2</button>
<p>Result: {{ser.result}}</p>
<div>
<sample-dir></sample-dir>
</div>
Вы должны передать результат в области следующим образом:
директивный код
(function(){
'use strict';
angular
.module('serviceApp')
.directive('sampleDir', sampleDir);
function sampleDir() {
return {
restrict: 'EA',
scope: {
result: "=" // added this line
},
templateUrl: "views/directive-template.html"
};
}
})();
Html-код
<div ng-controller="ServiceCtrl as ser">
<label for="num">Enter the number: </label>
<input type="text" id="num" ng-model="ser.number" ng-keyup="ser.square();">
<button>x2</button>
<p>Result: {{ser.result}}</p>
</div>
<div>
<sample-dir result="ser.result"></sample-dir> // pass result here
</div>
Директива html
<p>Square of the number is <strong>{{result}}</strong></p>