Как установить модель для одного представления в Angular JS?

У меня есть контроллер в Angular JS.

В этом контроллере у меня есть свойство $scope.users: это массив пользователей.

Этот контроллер используется двумя представлениями: /users и /users/:id.

Я видел, что модели $scope.users инициализируются каждый раз, когда я прихожу к просмотру пользователя.

Мой вопрос прост, как сделать, чтобы $scope.users применялся только к представлению /users, а не к представлению /users/:id?

Я сделал это с помощью метода $location.path, но не знаю, правильно ли это.

PS: у меня есть фабрика для извлечения пользователей, поэтому я знаю, что это синглтон...

Спасибо за ваши ответы.


person Thomas Pons    schedule 06.06.2013    source источник
comment
Что вы имеете в виду под применимым только к /users?   -  person Bertrand    schedule 07.06.2013
comment
@Bertrand: я хочу, чтобы переменная $scope.users инициализировалась только тогда, когда пользователь находится по URL-адресу /users.   -  person Thomas Pons    schedule 07.06.2013


Ответы (2)


Вы можете внедрить объект $element и выполнить поиск по dom, чтобы убедиться, что вы находитесь на нужной странице.

Вы можете ввести объект $location и посмотреть, находится ли URL-адрес на нужной странице.

Вы можете добавить что-то в шаблон для /user, чтобы он инициализировал массив, и тогда user/:id не включал бы тот же самый вызов.

В вашем коде вы можете сделать что-то вроде:

angular.module('myapp').constant('users',[]);
angular.module('myapp').controller('UserCtrl', function(users){
    if(!users.length){
        //push some things into the bloody array
    }
});

Я не говорю, что это лучший из всех способов. Это было труднее всего объяснить. Это похоже на создание глобальной переменной, но вы не создаете глобальную переменную. Вы делаете постоянную переменную в своем угловом модуле.

Я уверен, что есть еще способы. Это всего лишь несколько способов, которые я придумал.

person frosty    schedule 06.06.2013
comment
Хорошо, я понимаю, так что если я сделаю это с $location.path, это не анти-шаблон? - person Thomas Pons; 07.06.2013
comment
Мне не нравится система констант, в большом приложении я могу получить пятьдесят или более из них... $location.path работает хорошо, но это анти-шаблон. Я попробую константу в модуле и посмотрю, спасибо ! - person Thomas Pons; 08.06.2013

У меня есть ответ!

На самом деле AngularJS — это не фреймворк MVC, а фреймворк MVVM. В этом случае контроллер — это модель (в шаблоне MVVM), $scope — ViewModel, а HTML — представление (ng-controller — это dataContext в чистом .NET MVVM).

В этом случае контроллер должен иметь только представление !!

«В целом контроллер не должен делать слишком много. Он должен содержать только бизнес-логику, необходимую для одного представления».

http://docs.angularjs.org/guide/dev_guide.mvc.understanding_controller

Спасибо вам, ребята. Надеюсь, поможет.

person Thomas Pons    schedule 11.06.2013
comment
Как это решило ваш ответ. Пожалуйста, объясните, чтобы мы могли учиться. - person frosty; 12.06.2013