2015-02-23 54 views
1

我是新來angular,我一直在試圖做一個非常高級的指令。 大部分的指導工作,但目前有兩個問題呈現自己,我認爲他們都與範圍有關。angularjs和範圍問題(我認爲)

這裏是我的指令:

angular.module('test') 
    .directive('testKitDesigner', function() { 
     panels = []; 

     function bindEvents() { 
      console.log("bindingEvents"); 

      var styledElements = ["piping", "panel-1", "panel-2", "panel-3", "panel-4", "panel-5", "panel-6", "panel-7", "panel-8", "panel-9", "panel-10"]; 

      for (var i = 0; i < styledElements.length; i++) { 
       var target = document.getElementById(styledElements[i]); 

       console.log(target); 

       if (target) { 
        bindEvent(target); 
       } 
      } 
     }; 

     function bindEvent(target) { 
      console.log(target); 

      target.bindEvent("ngClick", selectPanel); 
     }; 

     function selectPanel(event) { 
      var path = angular.element(event.target); 

      panels = []; // Reset 

      if (attrs.testKitDesigner && attrs.testKitDesigner === 'advanced') { 
       panels.push(path); 
      } else { 
       var parent = path.parent(); 
       var paths = parent.children(); 

       for (var i = 0; i < paths.length; i++) { 
        var current = angular.element(paths[i]); 
        var tag = current[0].nodeName; 

        if (tag === 'path' || tag === 'polyline') { 
         panels.push(current); 
        } 
       } 

       console.log(panels.length); 
      } 
     }; 

     return { 
      restrict: 'A', 
      templateUrl: 'Views/Templates/designer.html', 
      link: function (scope, element, attrs) { 
       scope.step = 0; 
       scope.sport = 'General'; 
       scope.garment = 'Dress'; 
       scope.design = 'Angelus'; 

       scope.nextStep = function() { 
        scope.step++; 
       }; 

       scope.setSport = function (sport) { 
        scope.sport = sport; 

        scope.setSvg(); 
        scope.nextStep(); 
       }; 

       scope.setGarment = function (garment) { 
        scope.garment = garment; 

        scope.setSvg(); 
        scope.nextStep(); 
       }; 

       scope.setDesign = function (design) { 
        scope.design = design; 

        scope.setSvg(); 
        scope.nextStep(); 
       }; 

       scope.setSvg = function() { 
        var children = element.children(); 
        var template = scope.sport + '/' + scope.garment + '/' + scope.design; 

        for (var i = 0; i < children.length; i++) { 
         var child = angular.element(children[0]); 

         if (child.hasClass('base')) { 
          child.attr('test-svg', template); 
          bindEvents(); 

          return; 
         } 
        } 
       } 

       scope.setColor = function (color) { 
        for (var i = 0; i < panels.length; i++) { 
         var panel = angular.element(panels[i]); 
         var parent = panel.parent(); 

         if (parent.attr('id') === 'piping') { 
          panel.css({ 
           'stroke': color 
          }); 
         } else { 
          panel.css({ 
           'fill': color 
          }); 
         } 
        } 
       }; 

       scope.init = function() { 
        bindEvents(); 
       }; 

       scope.init(); // Set our defaults; 
      } 
     } 
    }) 
    .directive('testSvg', function() { 
     return { 
      restrict: 'A', 
      link: function (scope, element, attrs) { 
       scope.contentUrl = 'Views/Templates/' + attrs.testSvg + '.svg'; 
       attrs.$observe('testSvg', function() { 
        console.log(attrs.testSvg); 
        scope.contentUrl = 'Views/Templates/' + attrs.testSvg + '.svg'; 
       }); 
      }, 
      template: '<div ng-include="contentUrl"></div>' 
     }; 
    }); 

而且設計師模板看起來是這樣的:

<div class="base" test-svg="/General/Polo/Angelus"> 

</div> 
<div class="options"> 
    <h1>Simple kit designer</h1> 

    <div ng-hide="step != 0"> 
     <p>Choose your sport.</p> 

     <ul class="list-unstyled"> 
      <li><a href ng-click="setSport('Netball');">Netball</a></li> 
      <li><a href ng-click="setSport('General');">General</a></li> 
     </ul> 
    </div> 

    <div ng-hide="step != 1"> 
     <p>Choose your garment.</p> 

     <ul class="list-unstyled"> 
      <li><a href ng-click="setGarment('Dress');">Dress</a></li> 
      <li><a href ng-click="setGarment('Polo');">Polo</a></li> 
     </ul> 
    </div> 

    <div ng-hide="step != 2"> 
     <p>Choose your design.</p> 

     <ul class="list-unstyled"> 
      <li><a href ng-click="setDesign('Angelus');">Angelus</a></li> 
     </ul> 
    </div> 

    <div class="colors" ng-hide="step != 3"> 
     <p>Click an area to change the colour.</p> 

     <ul id="colour-picker" ng-hide="!picking" class="colours"> 
      <li><a class="colour-red" href ng-click="setColor('red');"></a></li> 
      <li><a class="colour-orange" href ng-click="setColor('orange');"></a></li> 
      <li><a class="colour-yellow" href ng-click="setColor('yellow');"></a></li> 
      <li><a class="colour-green" href ng-click="setColor('green');"></a></li> 
      <li><a class="colour-blue" href ng-click="setColor('blue');"></a></li> 
      <li><a class="colour-indigo" href ng-click="setColor('indigo');"></a></li> 
      <li><a class="colour-violet" href ng-click="setColor('violet');"></a></li> 
     </ul> 
    </div> 
</div> 

現在,應該發生,是當用戶選擇運動或服裝或設計時,test-svg屬性應該更改爲新值,然後加載相關的svg。 屬性確實更改,但觀察函數永遠不會被調用。我確信這與範圍有關,但我無法弄清楚。

回答

0

在鏈接階段test-kit-designer期間,您正在添加test-svg屬性。 test-svg屬性未編譯爲指令,因此$observe未觸發,請在$compile上進行閱讀以解決您的問題。

但是,我會建議重構您的代碼。考慮在模板中使用test-svg,將setSvg中的模板暴露在test-kit-designer中,並將其雙向綁定到test-svg中的另一個變量。