miraage
@miraage
Старый прогер

Почему директива Angular неправильно интерпретирует значение?

TL;DR
вместо массива - строка
plnkr.co/edit/ZwV8jmi0tUTgezWlEq3S?p=preview

Собственно, сам код.
!(function(ng) {
  'use strict';
  
  FooCtrl.$inject = ['$scope'];
  function FooCtrl($scope) {
    $scope.foo = {
      bar: [
        'foo',
        'bar'
      ]
    };
  }
  
  function FooDirective() {
    return {
      restrict: 'A',
      scope: {
        model: '@foo'
      },
      link: function($scope) {
        var watcher = function(model) {
          console.log(model, typeof model);
        };
        
        $scope.$watch('model', watcher, true);
      }
    };
  }
  
  ng.module('foo', [])
    .controller('FooCtrl', FooCtrl)
    .directive('foo', FooDirective);
})(window.angular);


<!DOCTYPE html>
<html data-ng-app="foo">

  <head>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.16/angular.min.js"></script>
    <script src="app.js"></script>
  </head>

  <body data-ng-controller="FooCtrl">
    <ul data-foo="{{foo.bar}}">
      <li data-ng-repeat="bar in foo.bar">
        {{bar}}
      </li>
    </ul>
  </body>

</html>


Ведь должен быть массив, а не строка.
Что я делаю не так?
  • Вопрос задан
  • 2714 просмотров
Решения вопроса 2
miraage
@miraage Автор вопроса
Старый прогер
Ответ был найден.

Дело в том, что в моем случае используется биндинг в одни ворота - "@" и в модель записывается интерпретируемое значение. В моем случае - строковое представление массива.
Если же использовать связанную модель "=", тогда все хорошо.

scope: {
  model: '=foo'
},

<ul data-foo="foo.bar">
Ответ написан
Комментировать
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Вопервых:
<ul data-foo="{{foo.bar}}">
тут вы записываете в атрибут значение foo.bar в виде строки. То есть у вас был массив, а вы его приводите к строке.

Но и так у вас работать ничего не будет, так как вы используете
scope: {
     model: '@foo'
},

тоесть в скоуп не будет передаваться само значение, будет передаваться только содержимое атрибута. Оно у вас и так есть.

plnkr.co/edit/iuswK0v6CgyiEMf3Lph9?p=preview

но проще всего будет сделать так:
scope: {
     model: '=foo'
},
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы