2013-08-15 6 views
1

У меня есть два элемента управления, отображаемых в каждом ng-повторе, один из которых - это раскрывающийся список для выбора типа адреса, а второй - вход с пользовательской директивой.AngularJS access ngrepeat child scope variable в директиве

Я хочу получить доступ к выбранному значению в первом элементе управления (установленном в переменной aFlag) в директиве второго элемента управления. Я думаю, что aFlag - это переменная области видимости, но я не могу получить дочернюю область в функции toggleAFlag(), чтобы установить для нее флаг, а также как получить доступ к этому флагу в директиве.

Ниже мой HTML-код

<div ng-app="myapp"> 
    <div ng-controller="AppCtrl"> 
    <div ng-repeat="item in itemList"> 
     <div>     
      <select ng-options="addressType.name for addressType in item.addressTypes" ng-model="addressType" 
       ng-change="toggleAFlag(addressType)" > 
      </select> 
     </div> 
     <div> <input type="text" ng-model="value" my-directive></input></div> 
    </div> 
    </div>  
</div> 

Javascript

function AppCtrl(){ 
    $scope.toggleAFlag = function(addressType) { 
    if (addressType == 'Business') 
     $scope.AFlag = true; 
    else { 
     $scope.AFlag = false; 
    } 
    }; 
} 

var myapp = angular.module('myapp',[]); 

myapp.directive('myDirective', function(){ 
    return { 
     require: '?ngModel', 
     link: function(scope, element, attrs, model){ 
      if (scope.AFlag == true){ 
       //do something on element variable 
      } 
     } 
    }; 
}); 
+0

Использование $ родителем. перед переменными, которые находятся в дочерних областях из повторений. Например scope. $ Parent.AFlag –

ответ

1

Я предполагаю, что модель данных выглядит следующим образом

$scope.itemList = [{ 
    addressTypes: [{ 
     name: 'add1', 
     addressType: 'Business' 
    }, { 
     name: 'add2', 
     addressType: 'Non Business' 
    }] 
}]; 

Make следующие изменения:

ng-change="toggleAFlag(addressType.addressType)" //pass in the addressType value of the current obj 

<input type="text" ng-model="AFlag" my-directive></input> //use AFLag as ng-model, Angularjs binds it automatically 

link: function (scope, element, attrs, model) { 
    scope.$watch(function() { //use $watch to watch any change, so the logic will be triggered if there is any change relating to the scope. 
     if (scope.AFlag == true) { 
      //do something on element variable 
     } 
    }) 
} 

Demo

+0

Спасибо за ваш хороший ответ и извините за мой поздний комментарий. Однако, если я добавлю еще один элемент в itemList, то у меня есть 2 раскрывающегося списка, выбирая выпадающий список, два текстовых поля получают одинаковое значение AFlag. Где я могу поместить toggleAFlag(), а также AFlag, чтобы каждое текстовое поле получало только AFlag своей собственной области (область ngrepeat). Еще раз спасибо. – bnguyen82

+0

@ bnguyen82 Я только что обновил Демо. Вы можете сохранить статус в объекте addressType. Взгляни, пожалуйста. – zsong

+0

В моем веб-приложении тег ng-model во втором элементе управления уже используется основной моделью, и мы не можем использовать его для прикрепления наших данных. Поэтому я использую настраиваемые атрибуты, такие как , а в моей-директиве смотрите его по области. Решение AFlag используется всеми элементами в ngrepeat, тогда как для каждого ngrepeat мне нужен отдельный AFlag. Можете ли вы предложить подсказку? – bnguyen82

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