2016-01-09 3 views
1


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

Директива по уходу за детьми -AngularJS двусторонняя привязка данных не будет работать

angular.module('management').directive('timeFrame', function() { 
return { 
    restrict: 'E', 
    templateUrl: '/Client/directives/timeFrame/timeFrame.html', 
    scope: { 
     timeFrame: '=', 
     deleteFrameFunction: '&', 
     index: '@' 
    } 

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

<div class="list-group-item" ng-repeat="timeFrame in ad.timeFrames"> 
    <time-frame index="{{$index}}" timeFrame="timeFrame" deleteFrameFunction="(function() {doStuff;})"></time-frame> 
</div> 

Все параметры проходят, но таймфрейм, который не определен.
Я попытался изменить способ передачи его {{timeFrame}} или: ad.timeFrames[{{$index}}] и многие другие способы, которые не удались.

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

Я не делал ничего другого, кроме других директив, которые работали для меня одинаково.

Любая помощь/объяснения будут оценены,
Заранее спасибо.

+0

в вашем HTML, переменная $ индекс должен быть индекс (без $) – Austio

+0

Вы пробовали 'ad.timeFrames [$ индекс]'? –

+0

Btw вместо двухсторонней привязки вы можете просто передать значение вниз, а затем использовать '$ emit' для отправки события родительскому? в родительской области вы можете '$ on' прослушать событие. –

ответ

0

Ваше соглашение об именах неверно. При привязке к свойствам с областью действия в соответствии с директивами применяется тот же самый принцип использования camelCase для дефиса, который используется для директив.

time-frame="timeFrame" 

Однако, поскольку это будет конфликтовать с вашим именем директивы, вы должны использовать другое имя свойства scope.

директива:

scope: { 
    boundTimeFrame: '=', 
    deleteFrameFunction: '&', 
    index: '@' 
} 

шаблона:

<time-frame index="{{$index}}" bound-time-frame="timeFrame" 
    delete-frame-function="(function() {doStuff;})"></time-frame> 
+0

Большое спасибо, это сработало. Чувство немного глупо сейчас. Хотелось бы узнать, как прошла функция deleteFrameFunction, хотя соглашение об именах также было неверным? Еще раз спасибо Давиду. – DotnetProg

+0

@DotnetProg правильно, что также было бы «неправильным», но только с точки зрения «стиля». Он «работал», потому что «&» позволяет вам вызывать родительскую функцию и передавать в нее параметр, а не привязывая что-то от родителя к изолированной области действия директивы. В этом случае «родительская функция» - это просто анонимная функция, которую вы определяете, поэтому ничего не нужно упоминать. –

+0

Единственное объяснение, о котором я могу думать, это то, что вы ссылались на него по атрибуту, а не по объему, который связал бы значение поперек. Для того чтобы он был связан с областью действия, он должен следовать соответствующему соглашению об именах. –

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