Angular JS директива: как установить выбранное значение или значение по умолчанию

0

Я создал управляющие элементы формы (tesxt, select, radio). В директиве я передаю значение, которое я хочу получить в директивной функции, и если это значение не установлено или пусто, тогда задайте значение по умолчанию из вопроса (data._pageAttributes.defaultValue)

HTML

<div ng-repeat="que in questions[$state.current.name]">
                        <div ng-if="que.QuestionData._fieldType === 'text'" >
                            <!-- {{answers[que.QuestionData._attributeName]}} -->
                            <text-control-dir data="que.QuestionData" default="94403"></text-control-dir>
                        </div>  
                        <div ng-if="que.QuestionData._fieldType === 'select'" >
                            <select-control-dir data="que.QuestionData" default="2016"></select-control-dir>
                        </div>
                        <div ng-if="que.QuestionData._fieldType === 'radio'" >
                            <radio-control-dir data="que.QuestionData"></radio-control-dir>
                        </div>
                        <div ng-if="que.QuestionData._fieldType === 'hidden' && que.QuestionData._attributeName != 'CBQ'" >
                            <hidden-control-dir data="que.QuestionData"></hidden-control-dir>
                        </div>
                    </div>

controlDirective.js

(function () {
    "use strict";

    angular
            .module("autoQuote")
            .directive('textControlDir', [textControlDir])
            .directive('selectControlDir', [selectControlDir])
            .directive('radioControlDir', [radioControlDir])
            .directive('hiddenControlDir', [hiddenControlDir]);

    function textControlDir()
    {
        return {
            transclude: true,
            restrict: 'E',
            scope: {
                data: '=data',
                default: '=default'
            },
            template: "<div ng-transclude></div><label>{{data._text}} </label><input ng-model='answer.PC' type='text' name='{{data._attributeName}}' id='{{data._attributeName}}' value='' >"
            ,
            link: function (scope, element, attrs)
            {
                console.log('default');
                console.log(attrs.default);
                if(attrs.default == '')
                {
                    attrs.default = data._pageAttributes.defaultValue;
                }

            }
        };
    }

    function selectControlDir()
    {
        return {
            transclude: true,
            restrict: 'E',
            scope: {
                data: '=data'
            },
            template: "<div ng-transclude></div><label>{{data._text}} </label><select type='text' name='{{data._attributeName}}' id='{{data._attributeName}}' >\n\
<option ng-repeat='ans in data._answerOptions'>{{ans._promptText}}</option></select>"
            ,
            link: function (scope, element, attrs)
            {
                //console.log("scope.data.QuestionData", scope.data.QuestionData);
            }
        };
    }

    function radioControlDir()
    {
         return {
            transclude: true,
            restrict: 'E',
            scope: {
                data: '=data'
            },
            template: "<div ng-transclude></div><label>{{data._text}} </label><input type='radio' name='{{data._attributeName}}' id='{{data._attributeName}}' value='Yes' >\n\
\n\
<input type='radio' name='{{data._attributeName}}' id='{{data._attributeName}}' value='No' >\n\
"
            ,
            link: function (scope, element, attrs)
            {
                //console.log("scope.data.QuestionData", scope.data.QuestionData);
            }
        };
    }

    function hiddenControlDir()
    {
        return {
            transclude: true,
            restrict: 'E',
            scope: {
                data: '=data'
            },
            template: "<div ng-transclude></div><label>{{data._text}} </label><input type='hidden' name='{{data._attributeName}}' id='{{data._attributeName}}' value='' >"
            ,
            link: function (scope, element, attrs)
            {
                //console.log(scope.data);
            }
        };
    }

}());

Файл CA.js имеет все вопросы и значение по умолчанию, которое мы зацикливаем на вопросы формы.

В директиве я хочу написать операцию, чтобы проверить, было ли значение передано в атрибуте по умолчанию или нет. если нет, то получите значение из question.que и установите выбранный вход и выберите элемент управления.

 link: function (scope, element, attrs)
        {
            if(attrs.default == '')
            {
                attrs.default = data._pageAttributes.defaultValue;
            }

        }

но это не работает для меня. Здесь я установил значение по умолчанию hardcoded для текста (почтовый индекс) 94403 и для транспортного средства 2016 года

Для почтового индекса: 94403 должен быть заполнен в поле ввода, а если это не пусто, тогда 35004 (из CA.json)

2 ответа

2
Лучший ответ

Если вы не установили значение по умолчанию, оно будет undefined не empty string

link: function (scope, element, attrs)
       {
           if(attrs.default)
           {
               attrs.default = scope.data._pageAttributes.defaultValue;
           }

       }

Он будет проверять как empty и undefined.

  • 0
    Я обновил plunker, но получил ошибку angular.js: 13708 ReferenceError: данные не определены в Object.link. Я думаю, что данные не доступны в функции ссылки на директиву.
  • 0
    @ Greatym.com, если данные являются свойством директивы, вы должны получить к ним доступ с помощью scope.data
Показать ещё 1 комментарий
0

Вы можете использовать ng-модель вместо значения по умолчанию и установить значение ng-модели в вашем контроллере, если данные, соответствующие элементу HTML, будут изменены, ng-model автоматически изменится.

http://jsfiddle.net/halirgb/Lvc0u55v/

<input ng-model="example">

Ещё вопросы

Сообщество Overcoder
Наверх
Меню