Создание и отображение текстового поля (пользовательская директива) на основе данных JSON и флажка onClicking в AngularJS - PullRequest
0 голосов
/ 09 декабря 2018

Я создал пользовательскую директиву для создания динамических элементов пользовательского интерфейса (флажок с соответствующим заголовком) для отображения книг на основе данных JSON.Моя цель состоит в том, чтобы создать текстовое поле при нажатии флажка (определенной книги) на основе доступности массива onSelection (Всего копий и проданных копий) с заголовком onSelection в качестве заполнителя внутри текстового поля только для книги, по которой щелкнули.До сих пор я сделал отображение текстового поля, не нажимая флажок.Но мне нужно отображать текстовое поле, только если в проверенной книге есть массив onSelcetion, относящийся к конкретной книге.Любая помощь приветствуется.

Включен весь код в plunker Код в plunker

HTML

<!DOCTYPE html>
<html ng-app="myApppli">
<head>
<meta charset="utf-8" />
<title>AngularJS Plunker</title>
<script>document.write('<base href="' + document.location + '" />');</script>
<link rel="stylesheet" href="style.css" />
<script data-require="angular.js@1.4.x" src="https://code.angularjs.org/1.4.12/angular.js" data-semver="1.4.9"></script>
<script src="app.js"></script>
</head>

<body>
<div ng-controller="mycontroller as ctrll">
    <content-item ng-repeat="item in ctrll.content" content="item">
    </content-item>

<div style ="margin-top: 30px;" ng-repeat="item in ctrll.content" content="item" ng-if ="item.onSelection">
<div ng-repeat="onSelection in item.onSelection">

<text-field-new></text-field-new> 
</div>  </div>
</div>

</body>

</html>

app.js

var app = angular.module('myApppli', []);

app.config(function ($sceDelegateProvider) {
$sceDelegateProvider.resourceUrlWhitelist(['self', '**']);
});

app.constant('URL', '');


app.factory('MedService', function ($http, URL) {
var getMeds = function () {
    return $http.get(URL + 'books.json');
};

return {
    getMeds: getMeds
};
});

app.factory('TemplateService', function ($http, URL) {
var getTemplates = function () {
    return $http.get(URL + 'templates.json');
};

return {
    getTemplates: getTemplates
};
});
datalist = [];
app.controller('mycontroller', function (MedService) {
var ctrll = this;

ctrll.content = [];

ctrll.fetchContent = function () {
    MedService.getMeds().then(function (result) {
        ctrll.content = result.data.books.contents;
                        datalist = ctrll.content;
    });
};
ctrll.fetchContent();
});
app.directive('contentItem', function ($compile, TemplateService) {
var getTemplate = function (templates, type) {
    var types = type.type;
    var template = '';            

    switch (types) {
        case 'textbox':
            template = templates.textboxTemplate;
            break;
        case 'CHECKBOX':
            template = templates.checkboxTemplate;
            break;
    }

    return template;
};

var linker = function (scope, element, attrs) {

    TemplateService.getTemplates().then(function (response) {
        var templates = response.data;

        element.html(getTemplate(templates, scope.content));

        $compile(element.contents())(scope);


    });
};

return {
    restrict: 'E',
    link: linker,
    scope: {
        content: '='
    }
};
});
app.directive("textFieldNew", ['$rootScope', function($rootScope) {
    return {
        restrict : 'E',
        templateUrl : 'text-field-new.html',
        scope : {
         field : "="
        },



        link : function (scope, element, attr) {
            scope.interfaceLabels = scope.$parent.interfaceLabels;
            scope.emailTextfieldClearButton = $rootScope.emailTextfieldClearButton;
            scope.enabledCursor = $rootScope.enabledCursor;

            //TODO - text field validation methods
            //Update keyboard and higiTextField to have field validation be triggered in higiTextField instead of keyboard.js
            //scope.onChangeMethod = scope.$watch('field.text', 
function(newVal, oldVal){
            //     if(typeof(scope.field.callback) === "function"){
            //    scope.field.callback();
            //}
            //});

            scope.setIndex= function(id){
                $rootScope.textFieldIndex = document.getElementById(id).selectionStart;
            };
            scope.startDrag = function(e){
                var e = window.event;
                scope.startDragX = e.pageX;
                e = null;
            };
            scope.clearSelected = function(id){
                var e = window.event;
                scope.stopDragX = e.pageX;
                if(scope.stopDragX > scope.startDragX){
                    document.getElementById(id).setSelectionRange(document.getElementById(id).selectionEnd, document.getElementById(id).selectionEnd);
                    $rootScope.textFieldIndex = document.getElementById(id).selectionEnd;
                }else {
                    document.getElementById(id).setSelectionRange(document.getElementById(id).selectionStart, document.getElementById(id).selectionStart);
                    $rootScope.textFieldIndex = document.getElementById(id).selectionStart;
                }
                e = null;
            };
            scope.clearTextField = function(){
                $rootScope.targetField.text ="";
                $rootScope.hideEmailExtensionTop();
                document.getElementById($rootScope.targetField.id).value = $rootScope.targetField.text;
                if(typeof(scope.field.callback) === "function"){
                    scope.field.callback();
                }
            };

            //Update labels if language is changed.
            scope.enabledCursorWatch = $rootScope.$watch('enabledCursor', function(){
                scope.enabledCursor = $rootScope.enabledCursor;
            });


        }
    }
  }]);
...