Нужны некоторые примеры привязки атрибутов в пользовательских тегах AngularJS

Я пытаюсь создать собственный тег, подобный следующему:

<mytag type="Big" />

где type - это атрибут, который привязывается к компоненту. таким образом, что он устанавливает текст в ярлыке, как показано ниже:

<label>{{type}}</label>

... (другие компоненты)...

Как говорится в документации, у меня есть контроллер, который устанавливает тип по умолчанию:

$scope.type = "Small";

так что если я использую свой тег без атрибута, тип все равно будет установлен.

Я пытаюсь сделать привязку с помощью директивы:

angular.module('TestPage',[])
      .directive('mytag',function() {
          return {
              restrict: 'E',
              templateUrl: 'component.html',
              scope: {
                  type: '='
              }
          }
      });

Обратите внимание, что у меня есть соответствующие параметры ng-app в моем шаблоне компонента (ng-app = "TestPage" ).

Моя проблема в том, что привязка к типу не кажется фактически привязанной.

Я прочитал документацию о том, как привязать переменную к компонентам с помощью директивы. Согласно документации, вы можете делать такие привязки внутри области видимости. Скоменты, по-видимому, могут содержать "объект-хэш" (что бы это ни было!), Который создает что-то, называемое "изоляцией области" (???). Такие области могут представлять "локальные свойства" следующими способами:

@или @attr - привязать свойство локальной области к атрибуту DOM. Результатом всегда является строка поскольку атрибуты DOM являются строками. Если имя attr не указано, то локальное имя и Имя атрибута одинаково. Определенное и видимое определение области: {localName: '@myAttr'}, то свойство scope widget localName будет отображать интерполированное значение hello {{name}}. По мере изменения атрибута name будет установлено свойство localName в области виджета. Имя считывается из родительской области (не для области компонента).

Да??? Что все это связано с правильным синтаксисом для привязки?

= или = выражение - установить двунаправленную привязку между локальным свойством scope и родительским  свойство области. Если имя attr не указано, локальное имя и имя атрибута совпадают.  Определенное и видимое определение области: {localModel: '= myAttr'}, то свойство scope widget localName будет отображать значение parentModel в родительской области. Любые изменения в parentModel будут отображаться в localModel, и любые изменения в localModel будут отображаться в parentModel.

Извините? Что здесь сказано?

& или & attr - обеспечивает способ выполнения выражения в контексте родительской области. Если нет  Имя attr указано, тогда локальное имя и имя атрибута совпадают. Данный   и определение виджета области видимости: {localFn: 'increment()'},  затем изолировать свойство scope localFn будет указывать на оболочку функции для выражения increment(). Часто желательно передать данные из области изоляции через выражение и в родительскую область, это можно сделать, передав карту локальных имен переменных и значений в оболочку выражения fn. Например, если выражение является приращением (суммой), мы можем указать значение суммы, вызвав localFn как localFn ({amount: 22}).

Теперь я полностью смущен! У вас есть теги виджета и какая-то связанная функция, которую я должен написать в порядке, чтобы выполнить привязку??? Все, что я хочу, - привязать значение к тегу метки!

Я скопировал приведенный выше текст из документации (http://docs.angularjs.org/guide/directive), чтобы указать: что это doco читает как старая документация UNIX: действительно полезно для тех которые уже знают систему, но не так полезны для новичков, которые пытаются развить настоящий опыт. Со всеми учебниками, которые показывают, как выполнять простые задачи в AngularJS (отлично подходит для игрушечных приложений, но не настолько хороших для приложений на стороне клиента, которые я хочу построить), почему их нет в более продвинутых материалах???

Хорошо, мне пора быть более конструктивным.

Может кто-нибудь, пожалуйста, дайте несколько приятных простых примеров того, как делать различные привязки, которые эта документация пытается так описать? Примеры, которые показывают правильный синтаксис этих операторов и описаний области (на простом английском языке) о том, как они возвращаются к атрибуту, добавляемому к пользовательскому тегу???

Благодарим вас за терпение и заблаговременно за помощь.

Ответ 1

Ты очень близко...

app.directive('mytag',function() {
    return {
        restrict: 'E',
        template: '<div>' +
            '<input ng-model="controltype"/>' + 
            '<button ng-click="controlfunc()">Parent Func</button>' + 
            '<p>{{controlval}}</p>' + 
         '</div>',
        scope: {
            /* make typeattribute="whatever" bind two-ways (=)
            $scope.whatever from the parent to $scope.controltype
            on this directive scope */
            controltype: '=typeattribute',
            /* reference a function from the parent through
               funcattribute="somefunc()" and stick it our
               directive scope in $scope.controlfunc */
            controlfunc: '&funcattribute',
            /* pass a string value into the directive */
            controlval: '@valattribute'
        },
        controller: function($scope) {                  
        }
    };
});

  <div ng-controller="ParentCtrl">
       <!-- your directive -->
       <mytag typeattribute="parenttype" funcattribute="parentFn()" valattribute="Wee, I'm a value"></mytag>
       <!-- write out your scope value -->
       {{parenttype}}
  </div>


  app.controller('ParentCtrl', function($scope){ 
       $scope.parenttype = 'FOO';
       $scope.parentFn = function() {
           $scope.parenttype += '!!!!';
       }
  });

Магия в основном определяется объявлением scope: в определении вашей директивы. с любым scope: {} в нем будет "изолировать" область действия от родителя, что означает, что она получает свою собственную область... без этого она будет использовать родительскую область. Остальная часть магии находится в свойствах области: scope: { 'internalScopeProperty' : '=externalAttributeName' }... где = представляет собой сценарий двухсторонней привязки. Если вы измените этот = на @, вы увидите, что он просто позволяет передать строку как атрибут директивы. & предназначен для выполнения функций из контекста родительской области.

Я надеюсь, что это поможет.


EDIT: Вот рабочий PLNKR

Ответ 2

Я тоже немного боролся с этой документацией, когда впервые попал в angular, но я попытаюсь прояснить ситуацию для вас. Во-первых, при использовании этого свойства scope он создает "изолированную область". Все это означает, что он не наследует никаких свойств из родительских областей, и поэтому вам не нужно беспокоиться о каких-либо столкновениях в пределах области.

Теперь обозначение "@" означает, что оцениваемое значение в атрибуте автоматически привязается к вашей области действия для этой директивы. Таким образом, <my-directive foo="bar" /> будет иметь область, имеющую свойство foo, которое содержит строку "bar". Вы также можете сделать что-то вроде <my-directive foo="{{bar}}" И тогда оцененное значение {{bar}} будет привязано к области. Поскольку атрибуты всегда являются строками, вы всегда будете иметь строку для этого свойства в области при использовании этих обозначений.

Обозначение '=' в основном обеспечивает механизм передачи объекта в вашу директиву. Он всегда извлекает это из родительской области директивы, поэтому у этого атрибута никогда не будет {{}}. Итак, если у вас есть <my-directive foo="bar" />, он свяжет все, что находится в $scope.bar, в вашей директиве в свойстве foo вашей области действия. Любые изменения, внесенные вами в foo в пределах вашей области действия, будут отбираться в bar в родительской области и наоборот.

Я не использовал '&' но почти так же, как и у других, поэтому я не знаю, как эти два. Насколько я понимаю, он позволяет оценивать выражения из контекста родительской области. Поэтому, если у вас есть что-то вроде <my-directive foo="doStuff()" />, всякий раз, когда вы вызываете scope.foo() в своей директиве, он вызывает функцию doStuff в родительской области директивы. Я уверен, что с этим вы многое можете сделать, но я не так хорошо знаком с этим. Возможно, кто-то еще может объяснить это более подробно.

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

scope: {
   foo1: '@',
   foo2: '=',
   foo3: '&'
}

При включении директивы должны быть атрибуты foo1, foo2 и foo3. Если вы хотите, чтобы свойство в вашей области действия отличалось от имени атрибута, вы можете указать это после символа. Таким образом, приведенный выше пример был бы

scope: {
   foo1: '@bar1',
   foo2: '=bar2',
   foo3: '&bar3'
}

При включении директивы должны быть атрибуты bar1, bar2 и bar3, и они будут связаны в области под свойствами foo1, foo2 и foo3 соответственно.

Надеюсь, это поможет. Не стесняйтесь задавать вопросы, на которых я могу прояснить свой ответ.