2015-06-11 3 views
2

Если у вас есть контроллер, что является предпочтительным способом для связывания данных, несколько меньших или один большой объект, например:

$scope.username = 'John Doe'; 
$scope.email = '[email protected]'; 
$scope.city = 'Amsterdam'; 

или

var user = {}; 
user.username = 'John Doe'; 
user.email = '[email protected]'; 
user.city = 'Amsterdam'; 

$scope.user = user; 
+0

Используйте второй один. Это будет иметь преимущество предотвращения ошибок дайджеста, а IMO - более чистая (ваша модель - это пользователь, а не область). – devqon

+0

«Большая» упрощает работу с несколькими пользователями. Но это может быть только мое предпочтение. Этот вопрос может быть отчасти основан на мнениях ... – Peter

+0

второй предпочтительнее –

ответ

2

Я бы с второй один из angularjs вики

Область наследования обычно проста, и вы часто не даже нужно знаете, что это происходит ... пока вы не попробуете привязку двухсторонней привязки (т. е. элементы формы, ng-model) к примитиву (например, number, string, boolean), определенному в родительской области изнутри дочерней области. Это не работает так, как многие ожидают, что он должен работать. Что происходит , так это то, что дочерняя область получает свое собственное свойство, которое скрывает/затеняет родительское свойство с тем же именем. Это не что-то, что AngularJS делает - так работает прототипное наследование JavaScript. Новые Разработчики AngularJS часто не понимают, что ng-repeat, ng-switch, ng-view и ng-include все создают новые дочерние области, поэтому проблема часто появляется, когда задействованы эти директивы. (См. Этот пример для быстрой иллюстрации проблемы.)

Эта проблема с примитивами может быть легко устранена, следуя «наилучшей практике» всегда иметь «.». в ваших ng-моделях - смотреть 3 минут стоит. Misko демонстрирует проблему примитивного связывания с n12-переключателем .

Наличие '.' в ваших моделях будет гарантировать, что прототипное наследование в игре. Таким образом, использование

<input type="text" ng-model="someObj.prop1"> rather than 
<input type="text" ng-model="prop1">. 

Если вы действительно хотите/нужно использовать примитивные, есть два пути:

Использование $ parent.parentScopeProperty в детской области. Это предотвратит создание дочернего объекта собственного свойства. Определим функцию на родительской области, и называют его от ребенка, передавая примитив значение до родителя (не всегда возможно)

https://github.com/angular/angular.js/wiki/Understanding-Scopes