Я очень новичок в угловом и стараюсь сделать директиву, которая позволяет администраторам добавлять изменения на веб-странице, а если пользователь не является администратором, просто отображает содержимое в неизменяемом формате. Я решил назвать эту директиву "Blurb", и я определил его следующим образом:Правильное ли использование угловой директивы?
аннотацию, modules.js:
;(function() {
'use strict';
angular.module('blurb', ['ngSanitize', 'mdotTamcCouncil.core']);
})();
аннотацию, directive.js
; (function() {
'use strict';
angular.module('blurb')
.directive('mcgiBlurb', blurb);
function blurb() {
return {
restrict: 'E',
replace: true,
templateUrl: jsGlobals.componentsFolder + '/blurb/blurb.html',
controller: function ($scope, blurbsFactory, userFactory) {
$scope.content = "";
$scope.blurbs = {};
$scope.currentUser = {};
this.editMode = false;
userFactory().success(function (data) {
$scope.currentUser = data;
});
blurbsFactory().success(function (data) {
$scope.blurbs = data;
$scope.content = $scope.blurbs[$scope.textKey];
});
this.enterEditMode = function() {
this.editMode = true;
};
this.saveEdits = function() {
this.editMode = false;
$scope.blurbs[$scope.textKey] = $scope.content;
};
},
controllerAs: 'blurb',
scope: {
textKey: "@"
}
};
};
})();
blurb.html
<div>
<form name="blurbForm" novalidate>
<div class="form-group"
ng-show="currentUser.isAdmin && blurb.editMode"
ng-class="{ 'has-error' : blurbForm.content.$invalid && !blurbForm.content.$pristine, 'has-success' : !blurbForm.content.$invalid && !blurbForm.content.$pristine }">
<textarea name="content" class="form-control" rows="6" ng-model="content" required="true"></textarea>
<p ng-show="blurbForm.content.$invalid && !blurbForm.content.$pristine">Content is required.</p>
<div>
<button type="button" class="btn btn-primary btn-sm" ng-disabled="blurbForm.$invalid" ng-click="blurb.saveEdits()"><i class="glyphicon glyphicon-ok-sign icon-white"></i> Save Changes</button>
</div>
</div>
<div class="form-group" ng-hide="blurb.editMode">
<p ng-bind-html="content"></p>
<div ng-show="currentUser.isAdmin">
<button type="button" class="btn btn-primary btn-sm" ng-click="blurb.enterEditMode()"><i class="glyphicon glyphicon-pencil icon-white"></i> Edit</button></div>
</div>
</form>
</div>
Я тогда его экземпляр на моем index.html следующим образом:
<mcgi-blurb text-key="mainPageTest"></mcgi-blurb>
Я создал следующие службы, которые будут использоваться директивой, с надеждой, что в конечном итоге я смогу извлечь их из данных, полученных из WebAPI.
аннотацию, service.js
(function() {
angular.module('mdotTamcCouncil.core').factory('blurbsFactory', function ($http) {
var promise = null;
return function() {
if (promise) {
// If we've already asked for this data once,
// return the promise that already exists.
return promise;
} else {
promise = $http.get(jsGlobals.blurbsDataURL);
return promise;
}
};
});
})();
пользователя service.js
(function() {
angular.module('mdotTamcCouncil.core').factory('userFactory', function ($http) {
var promise = null;
return function() {
if (promise) {
// If we've already asked for this data once,
// return the promise that already exists.
return promise;
} else {
promise = $http.get(jsGlobals.userDataURL);
return promise;
}
};
});
})();
И все это работает. Который кажется большим. Но у меня есть это подлое подозрение, что я не использую директивы в том смысле, в каком они предназначены. У меня есть куча «логики», которая управляет отображением html в html-шаблоне, и это кажется немного «грязным»/«взломанным»/«Я не знаю».
Это правильный способ реализации угловой директивы? Должен ли я иметь части этого в другом месте? Если да, то где?
Это похоже, как надуманный пример. Если ваша логика просто «Если пользователь является администратором, разрешите им редактировать текст», тогда текст может идти в стиле , тогда вы можете просто использовать директиву ngReadonly https://docs.angularjs.org/api/ ng/directive/ngReadonly –
Если вы используете метод @jonnyknowsbest, вам нужно убедиться, что вы проверяете его на стороне сервера, если они являются администратором или пользователем, поскольку вы можете удалить атрибут только для чтения в веб-инспекторе и все еще отправлять – Ronnie