Выставляя объект в области действия angularjs, не может получить доступ к свойствам

Итак, у меня есть следующая относительно простая директива Angularjs

app.directive('myDirective', function () {
      return {
          restrict: 'E',
          scope: {
              site: '@',
              index: '@'
          },
          template: '<div>{{site}}</div>',
          replace: true,

      }
  });

И вот где я вызываю директиву в HTML

<div id="eventGraphic" class="span12">
    <my-directive ng-repeat="site in IEvent.sites" site="{{site}}" index="{{$index}}"></my-directive>
</div>

Что, учитывая, что каждый site является объектом, производит этот вывод (скопированный из браузера)

{"name":"Hurlburt","_id":"5148bb6b79353be406000005","enclaves":[]}
{"name":"Walker Center","_id":"5148cca5436905781a000005","enclaves":[]}
{"name":"test1","_id":"5148ce94436905781a000006","enclaves":[]}
{"name":"JDIF","_id":"5148cf37436905781a000007","enclaves":[]} 

Однако, если я изменяю шаблон в директиве

 template: '<div>{{site.name}}</div>',

он не производит никакого вывода. Это похоже на довольно простой случай использования, любые идеи, что я могу делать неправильно? Желательным результатом будет только поле name в каждом объекте.

Ответы

Ответ 1

Вам нужно использовать '=' для сопоставления объекта. '@' подразумевает, что вы просто передаете строковое значение в новую область.

app.directive('myDirective', function () {
      return {
          restrict: 'E',
          scope: {
              site: '=', //two-way binding
              index: '@' //just passing an attribute as a string.
          },
          template: '<div>{{site}}</div>',
          replace: true,

      }
  });

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

<div id="eventGraphic" class="span12">
    <!-- below, site="site" is passing the expression (site) to
         the two way binding for your directive scope,
         whereas index="{{$index}}" is actually evaluating the expression
         ($index) and passing it as a string to the index attribute,
         which is being put directly into the directive scope as a string -->
    <my-directive ng-repeat="site in IEvent.sites" 
            site="site" 
            index="{{$index}}"></my-directive>
</div>