Нужны некоторые примеры привязки атрибутов в пользовательских тегах 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 соответственно.
Надеюсь, это поможет. Не стесняйтесь задавать вопросы, на которых я могу прояснить свой ответ.