2015-11-12 1 views
0

Я унаследовал беспорядок в рамках проекта «Угловой». Я никогда не перепутал с Angular слишком много, но знаю MVC достаточно хорошо, чтобы чувствовать, что я могу учиться. Мой вопрос: у меня есть свойство объекта JSON, для которого я хочу вернуть разные представления. (один является заархивированным состоянием, а другой - неархивированным). Поскольку оба они имеют разные шаблоны представлений, как мне вернуть шаблон без архива, если json.status == 'archived'Угловые условные взгляды?

У меня есть следующее свойство templatePUR текущего объекта StateProvider.

templateUrl: appConfig.viewPath + 'non-archived.html?v=' + appConfig.version 

Должен ли я просто вернуть несколько шаблонов шаблонов здесь? Или мне нужно создать новый URL-адрес?

Спасибо!

+0

Попробуйте 'нг-if' директиву. – Leo

ответ

1

Я несколько раз спускался по этой дороге, я не думаю, что нашел оптимальный путь, но я узнал кое-что.

На самом деле все зависит от того, когда у вас есть доступ к вашему json-объекту. Вы можете передать функцию в templateUrl и отправить в службу .. (Служба, которая возвращает ваш текущий json-объект, может быть отличной, но как бы вы ее обновили? Возможно, когда вы меняете маршрут правильно? Тогда у вас есть яйца-курица проблема. Вы не можете решить маршрут до тех пор, пока у вас нет json-объекта, но у вас нет объекта json, пока вы не измените маршрут.)

Но если у вас есть доступ к json-объекту, вы можете что-то сделать как это:

templateUrl: function(){ 
    var tpl = (json.status == 'archived') ? 'archived.html?v=' : 'non-archived.html?v='; 
    return appConfig.viewPath + tpl + appConfig.version 
} 

Но я думаю, что вы не имеете доступа к JSON-объекта, пока после загрузки маршрута.

Тогда я бы сказал, что самый простой способ (но, может быть, не очень красивый) - иметь только один шаблон. $scope.json = json в контроллере:

<div ng-if="json.status == 'archived'"> 
    <h1>ARCHIVED</h1> 
    ... 
</div> 

<div ng-if="json.status != 'archived'"> 
    <h1>NOT ARCHIVED</h1> 
    ... 
</div> 

Или, если вы думаете, что это слишком дешево, объявить два маршрута. Весь "create a whole new url path" не так болезнен, как вы думаете. Это будет значительно менее сложно, чем пытаться вытолкнуть значение с маршрута до его загрузки.

1

1: Попробуйте это. отправить json.status в $stateParams и применять условие внутри stateProvider:

$stateProvider.state('home', { 
    templateProvider: ['$stateParams', 'restService' , function ($stateParams, restService) { 
    restService.getJson().then(function(json) { 
     if (status.status == 'archived') { 
       return '<div ng-include="first.html"></div>'; 
     } else { 
       return '<div ng-include="second.html"></div>'; 
     } 
    }) 
    }] 
}); 

2: или просто в виде вы можете попробовать это:

<div ng-if="json.status == 'archived'"> 
    <h1>ARCHIVED</h1> 
    ... 
</div> 

<div ng-if="json.status != 'archived'"> 
    <h1>NOT ARCHIVED</h1> 
    ... 
</div> 
Смежные вопросы