1

трогании от «Как создать директивы, которые обмениваются данными» из angularJS руководства, https://docs.angularjs.org/guide/directive,

Я пытаюсь используйте этот макет, чтобы сделать судоходную форму.

Проблема заключается в том, что директивы изолировать их имена, поэтому, когда я хочу, чтобы ссылаться на основную области для вставки данных из входов, мне нужно сделать это:

<div id="showfoo">Foo = {{foo}}</div> 

<form-tabs> 
    <form-tab> 
    <input ng-model="$parent.$parent.$parent.$parent.foo" /> 
    </form-tab> 
    <form-tab> 
    <input ng-model="$parent.$parent.$parent.$parent.foo" /> 
    </form-tab> 
    <form-tab> 
    <input ng-model="$parent.$parent.$parent.$parent.foo" /> 
    </form-tab> 
</form-tabs> 

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

Вопрос в том, как этого избежать? В идеале я хотел бы сделать <input ng-model="foo">, и обновить его div#showfoo

См. http://plnkr.co/edit/jgD7a6W53518qpyLNUcx?p=preview для получения полного кода.

ответ

1

Прежде всего - Старайтесь избегать использования нг-модели на не элемента объекта: http://nathanleclaire.com/blog/2014/04/19/5-angularjs-antipatterns-and-pitfalls/

Во-вторых - Вы можете попробовать с обслуживанием (выглядит менее красиво), или использовать новую модель http://toddmotto.com/no-scope-soup-bind-to-controller-angularjs/, где вы можете просто продолжайте пользоваться областью наследования.

+0

Насколько я понял это, сближая связанные статьи, для этого все еще требуется указать, какие переменные я хочу связывать - чего-то, чего я хочу избежать, чтобы создать директиву многократного использования. Я здесь не прав? –

+0

Проблема не в использовании точки в ng-модели. Также необходимо было создать объект в контроллере, чтобы пропустить его, даже если он полностью пуст. –

+0

Извините - я не следовал. Идея во второй статье состоит в том, чтобы иметь как привязку, так и не изолировать область действия, что было невозможно до 1.4. Первый из них был потому, что я видел что-то, что смотрело, и я хотел предупредить вас :) – PiniH

0

Использование изолированной сферы не всегда необходимо, но если вы действительно должны, вы также можете отправить свой foo объект, как вы отправите title.

scope: { 
    title: '@', 
    foo: '=' 
    } 

И в HTML:

Foo = {{foo.x}} 

<my-tabs> 
<my-pane title="Hello" foo="foo"> 
    <input ng-model="foo.x"></input> 
    <h4>Hello</h4> 
    <p>Lorem ipsum dolor sit amet</p> 
</my-pane> 

Вы также должны инициализировать foo объект для того, чтобы передать свою ссылку, в этом конкретном примере это на $rootScope. You can check it here

+0

целая точка могла бы сделать общую директиву многократного использования, не изменяя ее для каждого варианта использования (связанные переменные будут меняться) –

+0

@ ÁkosVandra как это вообще? '$ parent. $ parent. $ parent. $ parent.foo' - вам все равно нужно знать имя' foo'.Это ваш выбор в любом случае :) Это просто еще один вариант. – Rudy

+0

Я действительно не следую :) Вы, очевидно, хотите знать, к чему привязываться. В любом случае, похоже, проблема заключалась в проблеме «без точек» в ng-модели или, скорее, в определении того факта, что я привязывался к строке, а не к атрибуту объекта в переводимой разметке. –

Смежные вопросы