Сложная ошибка отладки - токен '{' неверный ключ в столбце 2
Я обнаружил ошибку, которую не могу отладить.
Форма-field.html
<div class='row form-group' ng-form="{{field}}" ng-class="{ 'has-error': {{field}}.$dirty && {{field}}.$invalid }">
<label class='col-sm-2 control-label'> {{ field | labelCase }} <span ng-if='required'>*</span></label>
<div class='col-sm-6' ng-switch='required'>
<input ng-switch-when='true' ng-model='record[field][0]' type='{{record[field][1]}}' class='form-control' required ng-change='update()' ng-blur='blurUpdate()' />
<div class='input-group' ng-switch-default>
<input ng-model='record[field][0]' type='{{record[field][1]}}' class='form-control' ng-change='update()' ng-blur='blurUpdate()' />
<span class='input-group-btn'>
<button class='btn btn-default' ng-click='remove(field)'><span class='glyphicon glyphicon-remove-circle'></span></button>
</span>
</div>
</div>
<div class='col-sm-4 has-error' ng-show='{{field}}.$dirty && {{field}}.$invalid' ng-messages='{{field}}.$error'>
<p class='control-label' ng-message='required'> {{ field | labelCase }} is required. </p>
<p class='control-label' ng-repeat='(k, v) in types' ng-message='{{k}}'> {{ field | labelCase }} {{v[1]}}</p>
</div>
</div>
new.html
<h2> New Contact </h2>
<form name='newContact' novalidate class='form-horizontal'>
<form-field record='contact' field='firstName' live='false' required='true'></form-field>
<div class='row form-group'>
<div class='col-sm-offset-2'>
<button class='btn btn-primary' ng-click='save()'> Create Contact </button>
</div>
</div>
</form>
Я получаю следующую ошибку:
В браузере:
Ошибка: [$parse: синтаксис] http://errors.angularjs.org/1.4.1/$ parse / syntax? P0=%7B&p1= неверный%20key&p2=2&p3=%7B%7Bfield%7D%7D.%24error&p4=%7Bfield%7D%7D.%24error
На угловом сайте:
Ошибка: $parse: синтаксис Синтаксическая ошибка Синтаксическая ошибка: токен '{' неверный ключ в столбце 2 выражения [{{field}}.$ Error], начинающийся с [{field}}.$ Error].
Кто-то знает почему? Спасибо!
4 ответа
Я заметил, что эта ошибка также происходит при привязке данных к атрибуту в пользовательской директиве. куда
$scope.myData.value = "Hello!";
Это вызывает ошибку:
<my-custom-directive my-attr="{{myData.value}}"></my-custom-directive>
Но это прекрасно работает:
<my-custom-directive my-attr="myData.value"></my-custom-directive>
Ваша проблема здесь:
ng-class="{ 'has-error': {{field}}.$dirty && {{field}}.$invalid }"
Удалить {{ }}
:
ng-class="{ 'has-error': field.$dirty && field.$invalid }"
Также у вас есть такая же проблема здесь:
ng-messages='{{field}}.$error'
Заменить:
ng-messages='field.$error'
Однако их исправление, скорее всего, также вызовет ошибку для этой строки:
ng-message='{{k}}'
Таким образом, вы должны изменить его на:
ng-message='k'
Эта проблема произошла со мной, когда я следовал тому же учебнику, и я обнаружил, что решение в моем случае заключается в том, что я использую более новую версию ngMessages, поэтому мне нужно обновить файл bower.json с той же версией в видео (начиная с версии 1.4 пример не работает), тогда все работает нормально, и вот мой раздел зависимостей:
"dependencies": {
"angular": "1.3.9",
"angular-route": "1.3.9",
"angular-resource": "1.3.9",
"angular-messages": "1.3.9",
"bootstrap": "^3.3.6"}
Предположим, это мой HTML
<div ng-controller='MyCtrl' ng-init="array=[{id:1}, {id:2}]">Hi, it's {{name}}.
<div ng-repeat='obj in array'>
The current time is <display-time data="{{array}}"/>.
</div>
</div>
Вот display-time
это пользовательская директива, определение которой следующее
var demo = angular.module('demo', []);
demo.directive('displayTime', function($parse) {
return {
restrict: 'E',
replace: true,
scope: {
data: '='
},
transclude: false,
template: '<span class="currentTime"></span>',
link: function (scope, element, attrs, controller) {
var currentDate = new Date();
console.log(scope.data);
element.text(currentDate.toTimeString());
}
}});
Внимательно соблюдайте синтаксис, используемый для data="{{array}}"
,
Так как я использую data
в рамках пользовательской директивы (с заявлением
scope: {
data: '='
},
),
я получу parse error
Но если я использую синтаксис data="array"
и я использую следующий фрагмент кода внутри функции ссылки
scope: {
//data: '='
},
тогда я не получу parse error
,
Таким образом, вы должны использовать синтаксис data="{{array}}"
только если вы хотите получить к нему доступ как часть attrs
параметр внутри link
функция.