2013-10-04 4 views
0

У меня есть сложная структура модели (подробно описано ниже), и каждый раз, когда я хочу использовать ng-model, мне нужно получить доступ к следующим свойствам: user.communications.inGame.selected.AngularJs создает область действия от модели

Я хотел бы иметь возможность быть в состоянии сферы области и быть в состоянии использовать внутренний selectedбез всех префиксов (просто написание selected), так же, как я могу с ng-repeat.

ng-repeat не подходит здесь, поскольку каждое сообщение имеет разные свойства внутри него, и я не хочу иметь гигантский ng-switch внутри него.

Структура данных

$scope.user.communications = { 
      inGame: { 
       name: 'inGame', 
       selected: true, 
       image: 'assets/img/communication/ingame.png' 
      }, 
      teamspeak: { 
       name: 'teamspeak', 
       selected: true, 
       image: 'assets/img/communication/ts.png', 
       serverAddress: '', 
       port: '', 
       nickname: '', 
       password: '', 
       channel: '', 
       channelPassword: '', 
       autoBookmarkAdd: '' 
      }, 
      skype: { 
       id: 3, 
       name: 'skype', 
       selected: true, 
       image: 'assets/img/communication/skype.png', 
       username: '' 
      }, 
      ventrilo: { 
       name: 'ventrilo', 
       selected: true, 
       image: 'assets/img/communication/ventrilo.png', 
       serverName: '', 
       port: '', 
       serverPassword: '', 
       channelName: '', 
       channelPassword: '' 
      } 
     }; 
+0

Возможно, напишите вашу собственную директиву? Что-то вроде 'ng-with', а затем do' ng-with = "user.communications.inGame" 'Не уверен, что это сработает для вас или нет, поскольку это будет означать, что тогда шаблон должен быть в директиве. Только идея. –

+0

Я хочу получить тот же эффект, что и ng-repeat, просто не повторяя, Надеюсь найти встроенное решение, иначе я мог бы попробовать реализовать один –

+0

. Думаю, вам понадобится хотя бы один префикс. – kubuntu

ответ

0

пожалуйста, проверьте ниже HTML, вы можете использовать что-то вроде этого

<div ng-app> 
    <h2>Todo</h2> 
    <div ng-controller="TodoCtrl">  
    <ul class="unstyled"> 
     <li ng-repeat="todo in user.communications"> 
     {{todo.selected}} 
     </li> 
    </ul>  
</div> 
    </div> 

и контроллер

function TodoCtrl($scope) { 
$scope.user={}; 
$scope.user.communications = { 
     inGame: { 
      name: 'inGame', 
      selected: true, 
      image: 'assets/img/communication/ingame.png' 
     }, 
     teamspeak: { 
      name: 'teamspeak', 
      selected: true, 
      image: 'assets/img/communication/ts.png', 
      serverAddress: '', 
      port: '', 
      nickname: '', 
      password: '', 
      channel: '', 
      channelPassword: '', 
      autoBookmarkAdd: '' 
     }, 
     skype: { 
      id: 3, 
      name: 'skype', 
      selected: true, 
      image: 'assets/img/communication/skype.png', 
      username: '' 
     }, 
     ventrilo: { 
      name: 'ventrilo', 
      selected: true, 
      image: 'assets/img/communication/ventrilo.png', 
      serverName: '', 
      port: '', 
      serverPassword: '', 
      channelName: '', 
      channelPassword: '' 
     } 
    }; 

}

смотрите: http://jsfiddle.net/U3pVM/1505/

+0

Спасибо, но я уже упоминал, что ng-repeat не будет соответствовать здесь, поскольку каждое сообщение имеет разные свойства, я хочу иметь доступ к другим свойствам, не используя ng-switch –

0

Если вы хотите создать области на лету, а индивидуально подбирая каждый из элементов в $scope.user.communications, вы можете просто использовать ng-init. Однако для этого потребуется хотя бы один префикс

<div ng-model="one" ng-init="one=user.communications.inGame"> 
     {{ one.selected }} 
    </div> 
    ... 
Смежные вопросы