Одиночные / двойные кавычки в ng-init

Допустим, мы передаем начальные данные из php в представление Angular с помощью Mustache, и данные представляют собой некоторую строку, содержащую кавычки, например «Невозможно удалить элемент». Mustache по умолчанию переводит одинарную кавычку в ', например:

 ng-init="message='Can't delete item'"

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

Ошибка лексера: незавершенная цитата в столбцах ... ['] в выражении [message =' Can't delete item ']

Я не могу использовать тройные завитки усов, потому что тогда это будет примерно так:

 ng-init="message='Can't delete item'"

с той же ошибкой на выходе.

Plunk: http://plnkr.co/edit/GCq4gLrD1NxxCvAsjHy9?p=preview

Как элегантно решить эту проблему на этапе «Усы»?


person Ivan Chernykh    schedule 05.11.2014    source источник
comment
Вам следует уточнить заголовок вашего вопроса. Разве вы не можете заменить ' на \' и " на \" перед синтаксическим анализом angular?   -  person glepretre    schedule 06.11.2014
comment
Я не могу, он сломан с сервера   -  person Ivan Chernykh    schedule 06.11.2014
comment
не могли бы вы инициализировать значение из вашего контроллера (или функции ссылки директивы)?   -  person artur grzesiak    schedule 10.11.2014
comment
@arturgrzesiak нет, это часть старой системы (с определенной схемой отношений сервер / клиент), которую я не могу изменить. в чем проблема механизма синтаксического анализа Angular с '?   -  person Ivan Chernykh    schedule 10.11.2014
comment
@Cherniv не углублялся в это, но если вы продолжите &#039 с помощью \, то, похоже, все будет работать нормально: http://plnkr.co/edit/HPmadiLEHBHs5l6XLKiV?p=preview   -  person artur grzesiak    schedule 10.11.2014
comment
@arturgrzesiak my Mustache работает на php, и это выглядит так: ng-init="message='{{delete_message}}", так как я могу поместить туда `\`?   -  person Ivan Chernykh    schedule 10.11.2014
comment
@Cherniv Я не использую / не знаю php: вы имеете в виду, что delete_message не может быть установлен на: Невозможно удалить элемент в php или вы вообще не можете изменить значение delete_message?   -  person artur grzesiak    schedule 10.11.2014
comment
@arturgrzesiak я вообще не могу изменить значение delete_message, и я уверен, что проблема в angular, потому что 'Can\'t delete item' кажется допустимой строкой, поэтому я хочу найти решение, связанное с angular   -  person Ivan Chernykh    schedule 10.11.2014
comment
@Cherniv Проблема в том, что лексер angular интерпретирует символы в кодировке Unicode. Похоже, это ошибка angular. Проверьте, сработает ли это для вас (порядок двойных / одинарных кавычек изменен): plnkr.co/edit / NaKdD4OquzBftxyls0B4? P = предварительный просмотр.   -  person artur grzesiak    schedule 10.11.2014


Ответы (8)


Просто избегайте цитаты:

ng-init="message='Can\'t delete item'"
person AlexHv    schedule 05.11.2014
comment
Я не могу этого сделать, потому что HTML-код уже сломан с сервера - person Ivan Chernykh; 05.11.2014

Для экранирования одинарной кавычки используйте backslash \ следующим образом:

ng-init="message='Can\'t delete item'"
person Giwwel    schedule 05.11.2014
comment
то же самое с двойными кавычками - person Giwwel; 05.11.2014
comment
Я не могу этого сделать, потому что HTML-код уже сломан с сервера - person Ivan Chernykh; 05.11.2014
comment
если вы используете php для получения данных с сервера, попробуйте htmlspecialchars_decode - person Giwwel; 05.11.2014
comment
как я могу сочетать это с усами? - person Ivan Chernykh; 05.11.2014
comment
См. Здесь, чтобы узнать, как интегрировать htmlspecialchars_decode () с Mustache: stackoverflow.com/questions/17195443/ - person Werner; 05.11.2014
comment
@Werner, вы имеете в виду создание какой-то вспомогательной функции php, которая нужна? - person Ivan Chernykh; 11.11.2014
comment
@Cherniv Да, я говорю о создании Lambda, тогда у вас будет решение, адаптированное к вашим потребностям: github.com/bobthecow/mustache.php/wiki/Mustache-Tags#lambdas - person Werner; 11.11.2014

Попробуйте переключить двойные кавычки и одинарные кавычки.

так что вместо

ng-init="message='{{delete_message}}'"

пытаться

ng-init='message="{{delete_message}}"'
person cortexjesse    schedule 14.11.2014
comment
Спасибо, но таким образом, если у меня будет двойная кавычка в моем delete_message, ошибка появится снова - person Ivan Chernykh; 14.11.2014

Я создал директиву для размещения вашего контента. Она назначит тело директивы переменной scope.message.

app.directive('myMessageVar',function(){
  return{
            restrict :'A',
            scope:{
              message:'=myMessageVar'
            },
            link: function (scope, iElement, iAttrs) {
               scope.message=iElement.text(); 
               iElement.text('');
          }
   }

})

В HTML

 <span my-message-var="message">Can&#039;t delete item</span>

Plunkr: http://plnkr.co/edit/QRtXLX1IiGS6VV0Rc78I?p=preview

person Sridhar Chidurala    schedule 16.11.2014
comment
спасибо, но, к сожалению, я не могу изменить структуру разметки - person Ivan Chernykh; 20.11.2014

Сегодня я столкнулся с этой проблемой и не нашел ответа. Но этот фрагмент кода мне подходит.

<?php $data_slashed = htmlentities(addslashes(html_entity_decode($data,ENT_QUOTES)),ENT_QUOTES); ?>

Где $data - некоторые данные, которые были закодированы с помощью htmlentities.

Тогда вы можете сделать это

<p ng-bind-html= "data" ng-init="data='<?php echo $data_slashed; ?>'" />

Я не пробовал усы, но это работает для моего шаблона php. Надеюсь, это поможет кому-то другому.

person RLVillacalos    schedule 01.07.2016

Я считаю, что вы неправильно используете init. Из документов ngInit:

Единственное подходящее использование ngInit - это наложение специальных свойств ngRepeat, как показано в демонстрации ниже. Помимо этого случая, вы должны использовать контроллеры, а не ngInit для инициализации значений в области видимости.

Для передачи значений со стороны сервера, я думаю, вам следует использовать https://docs.angularjs.org/api/ng/service/$http (AJAX) или _1 _ / _ 2_ из angular.Module.

Например:

// define a value
app.value('message','Can&#039;t delete item');

// define a constant
app.constant('constMessage', 'Can&#039;t delete item');

Затем вы можете внедрить их в службы или контроллеры. например, для контроллера:

// use it in a controller
app.controller('someController', ['$scope', 'message', 'constMessage', 
function($scope, message, constMessage) {
    $scope.message = message;
    $scope.constMessage = constMessage;
});
person Kurt    schedule 14.11.2014
comment
Спасибо, я знаю о value и constant и использую их в других своих проектах (stackoverflow.com/questions/18097923/), но в этом конкретном проекте я могу использовать только директиву ng-init для передачи данных - person Ivan Chernykh; 14.11.2014

Это может сработать, если ваша проблема ограничена одинарными кавычками

ng-init='message="Can&#039;t delete item"'
person Sridhar Chidurala    schedule 15.11.2014

Попробуйте код ниже, он должен работать.

<body ng-controller="MainCtrl" ng-init='message="Can&#039;t delete item"'> <p>Message: {{message}}</p> </body>

person Rishi Saraf    schedule 17.11.2014