2014-07-01 3 views
1

현재 각도 지시문 등에 대한 이해를 높이기 위해 스파이크를 구현 중입니다.

전제 조건은 여러 통화 쌍에 대해 FX 감시 목록을 만드는 것입니다.

내 데이터 피드는 socket.io를 통해 가격 업데이트를 위해 설정됩니다.

내가 가지고있는 장애물은 가격 변동에 따라 CSS를 바꿀 수 있습니다 (즉 위로 화살표는 위로, 아래로 화살표는 아래로).

저는 감시자 기능이 필요하다고 생각하지만 시작해야 할 곳에서 고생하고 있습니다. 일을 수행하기 위해 일종의 표현을 찾고 있었지만 ... 방법은 $ 감시자처럼 보이기 시작하지 않았습니다. 내 지침에서 이전 가격을 범위로 저장하면 각 가격에 하나가 아닌 이전 값이 하나만 있다는 의미이기 때문에 결함이있었습니다.

내 질문에 : 솔루션은 ng-class 또는 $ watcher 기능 설정 중입니까?

Heres는 내 코드 ...

HTML 템플릿

<div ng-repeat="rate in rates" ng-click="symbolSelected(rate)"> 
     <div class="col-1-4"> 
      {{rate.symbol}} 
     </div> 
     <div class="col-1-4"> 
      <span ng-class='bullBear(rate.bidPoint)' ></span> {{rate.bidBig}}<span class="point">{{rate.bidPoint}}</span> 
     </div> 

     <div class="col-1-4"> 
      <span ng-class='bullBear(rate.offerPoint)' ></span> {{rate.offerBig}}<span class="point">{{rate.offerPoint}}</span> 
     </div> 

     <div class="col-1-4"> 
      {{rate.timeStamp | date : 'hh:mm:ss'}} 
     </div> 

    </div> 
내 지시어는 현재 언급 한 바와 같이이 작동하지 않습니다와 bullBear 방법은 $ 감시자처럼 보이기 시작했다 ... 다음과 같습니다

기능.

.directive('fxmarketWatch', function(fxMarketWatchPriceService){ 

     return { 

      restrict:'E', 
      replace:'true', 
      scope: { }, 

      templateUrl:'common/directives/fxMarketWatch/marketwatch.tpl.html', 

      controller : function($scope, SYMBOL_SELECTED_EVT,fxMarketWatchPriceService){ 

       $scope.symbolSelected = function(currency){ 
        $scope.$emit(SYMBOL_SELECTED_EVT,currency); 
       } 

       $scope.bullBear = function(newPrice){ 


        if ($scope.oldPrice> newPrice){ 

          return ['glyphicon glyphicon-arrow-down','priceDown']; 
        } 
        else if ($scope.oldPrice > newPrice){ 

          return ['glyphicon glyphicon-arrow-up','priceUp']; 
        } 

       } 


       $scope.$on('socket:fxPriceUpdate', function(event, data) { 

        $scope.rates = data.payload; 

       }); 
      } 

     } 

    }) 
+0

, 해결하기 위해 비교적 간단하게이 문제 그래서이 시간 rate.bidPointrate.offerPoint$watch -ing를 위해 사용할 수 있어야합니다 그리고 초기 문제의 맥락에서 볼 때 Konstantin Krass가 제안한 것과 같은 솔루션을 사용 했으므로 전문가가 더 많은 통찰력을 제공하여 투표를하게되었습니다. – SPA

답변

0

난 당신이 ng-class$watcher를 모두 사용하는 것이 좋습니다 것입니다. 두 실제로 서로를 칭찬 할 수

가 UPDATE : 코드가 ng-repeat 작동하려면, 우리는 또 다른 controller에 CSS 클래스 로직을 모두 마이그레이션해야합니다

app.controller('PriceController', function($scope) { 
    // we first start off as neither up or down 
    $scope.cssBid = 'glyphicon'; 
    $scope.cssOffer = 'glyphicon'; 

    var cssSetter = function(newVal, oldVal, varName) { 
     if (angular.isDefined(oldVal) && angular.isDefined(newVal)) { 
      if (oldVal > newVal) { 
       $scope[varName] = 'glyphicon glyphicon-arrow-down priceDown'; 
      } else if (newVal > oldVal) { 
       $scope[varName] = 'glyphicon glyphicon-arrow-up priceUp'; 
      } else { 
       $scope[varName] = 'glyphicon'; 
      } 
     } 
    }; 

    // watch for change in 'rate.bidPoint' 
    $scope.$watch('rate.bidPoint', function(newVal, oldVal) { 
     cssSetter(newVal, oldVal, 'cssBid'); 
    }); 
    // watch for change in 'rate.offerPoint' 
    $scope.$watch('rate.offerPoint', function(newVal, oldVal) { 
     cssSetter(newVal, oldVal, 'cssOffer'); 
    }); 
}); 

다음, 우리는이 PriceController 바인딩 divdiv에 있습니다. 이렇게하면 Angular는 각 rate에 대해 controller 인스턴스를 만들고 rates에 넣습니다.

이제
<div ng-repeat="rate in rates" ng-click="symbolSelected(rate)" ng-controller="PriceController"> 
    <div class="col-1-4"> 
     <span ng-class='cssBid'></span> {{rate.bidBig}}<span class="point">{{rate.bidPoint}}</span> 
    </div> 

    <div class="col-1-4"> 
     <span ng-class='cssOffer'></span> {{rate.offerBig}}<span class="point">{{rate.offerPoint}}</span> 
    </div> 
</div> 

이 지침의 컨트롤러가 이전보다 훨씬 짧아집니다 : 내 데이터 구조 조정 후

controller: function($scope, SYMBOL_SELECTED_EVT, fxMarketWatchPriceService){ 
    $scope.symbolSelected = function(currency) { 
     $scope.$emit(SYMBOL_SELECTED_EVT, currency); 
    } 

    $scope.$on('socket:fxPriceUpdate', function(event, data) { 
     $scope.rates = data.payload; 
    }); 
} 
+0

답장을 보내 주셔서 감사합니다. 솔루션을 테스트 해 보았습니다. $ watch 메소드가 실행되지 않고 있지만, 시작시 한 번만 - 어둠 속에서도 (어쨌든 저는 $ 감시자에 대해 머리를 터지기 시작했습니다. 범위 rate.bid에 실제로 property rate.bid isnt는 $ scope.rates [n] rate.bidPoint에서 찾을 수 있습니까? – SPA

+0

@SPA 아 맞습니다. 나는 이것 모두가'ng-repeat' 안에 싸여 있다는 것을 완전히 잊어 버렸습니다. 우리가 ng-repeat 인스턴스 당 컨트롤러를 도입한다면 여전히'$ watch'를 사용할 수 있습니다. 나는 지금 당장 책상에서 떨어져 있지만 돌아올 때 다른 해결책을 쓸 것이다. – b0nyb0y

+0

@SPA이 업데이트 된 솔루션을 사용하면 이제'$ watch'가 작동하고 각 rate는 서로 독립적으로 업데이트되는 CSS 문자열을 가질 수 있습니다. – b0nyb0y

1

당신은 ng-class을 수정할 수 있으며, 스타일과 배치 클래스가 코드에서 수행하지 않아야하기 때문에, 뷰에 논리를 이동합니다.

<div class="col-1-4"> 
    <span class="glyphicon" ng-class="{'glyphicon-arrow-up priceUp': oldPrice > rate.bidPoint, 'glyphicon-arrow-down priceDown':oldPrice > rate.bidPoint}"></span> {{rate.bidBig}}<span class="point">{{rate.bidPoint}}</span> 
</div> 

또는 같은

:

<span class="glyphicon {{oldPrice > rate.bidPoint ? 'glyphicon-arrow-down priceDown':'glyphicon-arrow-up priceUp'}}></span> {{rate.bidBig}}<span class="point">{{rate.bidPoint}}</span> 
+0

근사하지만 어디에서 오래된 가격을 얻을 수 있습니까? - 나는 $ 범위를 가지고있어 주셔서 감사합니다.oldPrice가 지시어에 있지만이 방법에 대한 모든 호출에 oldPrice가 설정되면서 접근법에 결함이 있다고 생각할 때이 경로를 따라 가지 않기로 마음 먹었습니다. – SPA