2014-01-29 108 views
3

我們有一個指令(讓我們說檢查按鈕)創建一個帶有某些特定功能的樣式複選框。

我要求在指令中使用ng-form,所以我可以在指令中使用formCtrl,並且我成功地將表單設置爲$ dirty或$ valid。 我的問題是如何將指令創建的特定元素設置爲$ valid或$ dirty,並且通常表現爲角度表單元素。只是做element.$valid = false不起作用fromCtrl.addControl(element)所以我卡住了。我應該強調,這個指令是在ng-repeat循環中使用的,所以我可以在其上設置一個「名稱」,因爲ng-repeat可以通過編程設置一個名稱(必須是字符串)

這是simplfied)模板:

<div class="check-button "> 
    <div c" ng-class="{ 'active': value != undefined ? btnState == value : btnState }"> 
     <i class="icon-ok"></i> 
    </div> 
    <div class="pull-left btn-label" ng-transclude></div> 
</div> 

,這是代碼:

angular.module('our.directives').directive('checkButton', [function() { 
    return { 
     restrict: 'A', 
     require:'?^form', //may be used outside a form 
     templateUrl: '/tempalte/path/tpocheckbutton.html', 
     scope: { 
      btnState: '=ngModel', 
      value: '=radioBtn' 
     }, 
     replace: true, 
     transclude: true, 
     link: function($scope, $element, $attrs, formCtrl) { 
      if(formCtrl){ 

       formCtrl.$addControl($element)//doesn't work 
      } 

      $scope.$watch(function() { 
       return $scope.btnState; 
      }, function(newValue) { 
       $scope.btnState = newValue; 
      }); 

      var _onElementClick = function() { 
       if($scope.value != undefined) { 
        $scope.btnState = $scope.value; 
       } else { 
        $scope.btnState = !$scope.btnState; 
       } 
       if(formCtrl){ 
//     $element.$dirty = true;//doesn't work 
        formCtrl.$setDirty(); //does set the form as dirty - but not the field 
       } 

      }; 

      $element.find('.button, .btn-label').on('click', _onElementClick); 
     } 
    }; 
}]); 

我們使用的是最新版本的角度(1.2.10)

+0

您無法將元素添加到「formController」,您需要請求該元素的「ngModelController」。現在,你可以提供一名運動員嗎? –

回答

1

你基本上需要同時需要formngModel,因爲form.$addControl需要ngModelController

+0

謝謝@beyers!並且在要求兩者之後,我如何添加它?只需添加modelCtrl對象? – alonisser

+0

@alonisser你實際上並不需要做任何事情來註冊控件,因爲ngModel指令本身向表單註冊。所以你所需要的只是對ngMogelController的引用,所以你可以使用它的API。對於ngModelController API和自定義控件的例子,請看http://docs.angularjs.org/api/ng.directive:ngModel.NgModelController – Beyers