I have 3 nested directives:

ExchangeWidget -> CoinInput (2 total) -> Coin (Several)



The code:

`ExchangeWidgetDirective`


    'use strict';
    
    import cointInputTpl from './exchangewidget.html';
    
    function exchangeWidgetComponenet($log) {
    'ngInject';
    
      var directive = {
        restrict: 'E',
        templateUrl: cointInputTpl,
        controller: exchangeWidgetController,
        controllerAs: 'vm',
        bindToController: true,
        scope: {
          amount: '@',
          type: '@',
          address: '=',
          postSelect: '=',
          changeCounterPrice: '='
        }
      };
    
      return directive;
    
      function exchangeWidgetController ($scope, CHANGED_EVENT_SUFFIX) {
        'ngInject';
        let self = this;
    
        self.postSelect = function (newCoin, prevCoin, type) {
            // TODO: migrate to conf
            type = type === 'deposit' ? 'receive' : 'deposit';
            let eventData = {
              newCoin: newCoin,
              prevCoin: prevCoin,
            };
            let event = 'reset' + type;
            $scope.$broadcast(event, eventData);
        };
    
        self.changeCounterPrice = function (eventData) {
          let eventName = eventData.type + CHANGED_EVENT_SUFFIX;
          $scope.$broadcast(eventName, eventData);
        };
    
        self.showWithdrawAddress = function () {
          $scope.$parent.showWithdrawAddress = true;
        }
    
      }
    
    }
    
    export default exchangeWidgetComponenet;





`CointInputDirective`





    'use strict';
    
    import cointInputTpl from './coininput.html';
    import _ from 'lodash/core';
    
    function coinInputComponenet($log) {
    'ngInject';
    
      var directive = {
        restrict: 'E',
        templateUrl: cointInputTpl,
        controller: coinInputController,
        controllerAs: 'vm',
        bindToController: true,
        scope: {
          amount: '@',
          type: '@',
          selectedCoin: '@',
          showWithdrawAddress: '@',
          postSelect: '=',
          changeCounterPrice: '='
        }
      };
    
      return directive;
    
      function coinInputController ($scope, $element, $attrs,
                                    Price, AMOUNT_CHANGE_DEBOUNCE, 
CHANGED_EVENT_SUFFIX) {
        'ngInject';
    
        let self = this;
        let hideCounterEvent = 'reset' + this.type;
        // TODO: refactor to configs
        let counterChangedEvent = this.type === 'deposit' ? 'receive' + 
CHANGED_EVENT_SUFFIX : 'deposit' + CHANGED_EVENT_SUFFIX;
    
     $log.debug('Hello from coinInput controller!');
    
     self.icons = [
          {name: 'BTC'},
          {name: 'LTC'},
          {name: 'ETH'}
        ];
    
     self.select = function (coinName) {
       let prevCoin = self.selectedCoin;
       self.selectedCoin = coinName;
       self.postSelect(coinName, prevCoin, self.type);
       $scope.$broadcast('reset')
        };
    
     $scope.$on(hideCounterEvent, function(event, eventData) {
       if (eventData.newCoin === this.selectedCoin) {
         self.select(eventData.prevCoin);
          }
        });
    
     $scope.$watch('amount', function(newAmount, oldAmount) {
       let eventData = {
            newAmount: newAmount,
            oldAmount: oldAmount,
            coin: self.selectedCoin,
            type: self.type
          };
    
          self.changeCounterPrice(eventData)
        });
    
     $scope.$on(counterChangedEvent, function (event, eventData) {
          _.debounce(function () {
            let pair = self.type === 'deposit' ? self.selectedCoin.
toUpperCase() + eventData.coin.toUpperCase() :
              eventData.coin.toUpperCase() + self.selectedCoin.toUpperCase
();
    
            Price.all(pair).all('latest').getList().then(function (priceList
) {
              let basePrice = priceList[0].ask;
              $scope.amount = eventData.newAmount * basePrice;
            });
          }, AMOUNT_CHANGE_DEBOUNCE);
        });
    
    
      }
    
    }
    
    export default coinInputComponenet;






`CoinDirective`


    'use strict';
    
    import coinTpl from './coin.html';
    
    function coinComponent($log) {
    'ngInject';
    
      var directive = {
        restrict: 'E',
        templateUrl: coinTpl,
        controller: coinController,
        controllerAs: 'vm',
        bindToController: true,
        scope: {
          selected: '@',
          expanded: '@',
          name: '@',
          iconSrc: '@',
          iconClass: '@',
          select: '='
        }
      };
    
      return directive;
    
      function coinController ($scope) {
        'ngInject';
        // TODO: migrate to conf
        let self = this;
    
     this.selectCurrent = function () {
       self.select(self.name);
          self.selected = true;
        };
    
        $scope.$on('reset', function() {
          self.selected = false;
        });
    
      }
    
    
    }
    
    export default coinComponent;



The error I get is:

TypeError: self.changeCounterPrice is not a function
    at coininput.directive.js:68
    at Scope.$digest (angular.js:18210)
    at Scope.$apply (angular.js:18480)
    at bootstrapApply (angular.js:1952)
    at Object.invoke (angular.js:5040)
    at doBootstrap (angular.js:1950)
    at bootstrap (angular.js:1970)
    at Object.angular.bootstrap (ocLazyLoad.js:760)
    at HTMLDocument.<anonymous> (index.bootstrap.js:18)
    at mightThrow (jquery.js:3583)


(The same for `postSelect`)


Stack trace:

(anonymous) @ angular.js:14642
(anonymous) @ angular.js:11102
$digest @ angular.js:18228
$apply @ angular.js:18480
bootstrapApply @ angular.js:1952
invoke @ angular.js:5040
doBootstrap @ angular.js:1950
bootstrap @ angular.js:1970
angular.bootstrap @ ocLazyLoad.js:760
(anonymous) @ index.bootstrap.js:18
mightThrow @ jquery.js:3583
process @ jquery.js:3651
setTimeout (async) 
(anonymous) @ jquery.js:3689
fire @ jquery.js:3317
fireWith @ jquery.js:3447
fire @ jquery.js:3455
fire @ jquery.js:3317
fireWith @ jquery.js:3447
ready @ jquery.js:3920
completed @ jquery.js:3930


What is super weird, is that for `select` works just fine! (two way bound 
function, by reference from the isolated scope of `coinInputDirective` to 
`coinDirective`)



Link to StackOverflow:
https://stackoverflow.com/questions/45662223/angular-cannot-pass-function-by-reference-into-an-isolated-scope-several-nested

-- 
You received this message because you are subscribed to the Google Groups 
"Angular and AngularJS discussion" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to angular+unsubscr...@googlegroups.com.
To post to this group, send email to angular@googlegroups.com.
Visit this group at https://groups.google.com/group/angular.
For more options, visit https://groups.google.com/d/optout.

Reply via email to