Я использую angularJS для создания SAP. Проблема, с которой я столкнулся, находится в одном из моих файлов шаблона.

Я хочу установить значение директивы ng-click, используя переменную, объявленную в этом контроллере. В зависимости от изменения значения этой переменной значение ng-click должно измениться. Вот пример проблемы:

<p>Set page content template via button click</p>
<!-- Actual values of ng-click without variables -->
<button ng-click="template='page1'">Show Page 1 Content</button>
<button ng-click="template='page2'">Show Page 2 Content</button>

<!-- What I have tried

Declaring a scope variable 'page', and setting it's value to 'page1' as

        $scope.page = "page1";

<button ng-click="template=page">Show Page 1 Content</button>
<button ng-click="template='{{page}}'">Show Page 1 Content</button>
<button ng-click="template=(page)">Show Page 1 Content</button>

Also tried declaring the variable as

$scope.page = "template='page1'"; or $scope.page = template='page1'

And inject like:

<button ng-click=page>Show Page 1 Content</button>
and also using (page), {{page}}, page ; with and without quotes

-->

<ng-include src="template"></ng-include>

<script type="text/ng-template" id="page1">
    <p>This is content of page 1</p>
</script>

<script type="text/ng-template" id="page2">
    <p> This is content of page 2</p>
</script>

Значение ng-click должно основываться на значении присвоенной ему переменной.

Редактировать:

Только что выяснил, что мы можем вызывать только функции, используя директиву ng-click, а не переменную. Итак, переменная не может быть назначена. Но я не могу сказать, правда ли это по-прежнему, и пока нет возможности это сделать.

Ссылка на вопрос: Angular JS устанавливает динамическое значение в директиву ng-click < / а>

Но есть ли другой способ добиться этого? Любая помощь будет очень признательна. Спасибо.

-1
ZeroFlex 5 Июн 2016 в 02:54
В основном строю роутер для бедняков. Рассмотрите возможность использования маршрутизатора ngRoute или angular-ui-router. Преимущества маршрутизатора заключаются в том, что URL-адрес будет соответствовать шаблону на основе любого соглашения об именах, которое вы хотите использовать, и каждый маршрут будет иметь собственный контроллер.
 – 
charlietfl
5 Июн 2016 в 03:07
Вы можете установить переменную в ng-click. Ответ, на который вы ссылаетесь, указывает на то, что вы не можете использовать интерполяцию {{}} в выражении ng-click, которое отличается
 – 
charlietfl
5 Июн 2016 в 03:29
Ну, я тоже использовал ngRoute. Первоначально я вводил значения переменных в представление на основе URL-адреса, имея только один шаблон, содержимое которого динамически изменялось в зависимости от местоположения URL-адреса. Но я делаю этот веб-сайт вместе с другими товарищами-разработчиками (просто так) в моей команде, которые не так хорошо разбираются в веб-разработке и не все используют angular. Использование шаблонов и включения упрощает для них поиск и редактирование своей части с помощью простого HTML.
 – 
ZeroFlex
5 Июн 2016 в 03:31
Да, ты прав. Как я уже сказал, просто хотел узнать, остается ли он таким же или есть другой способ достичь того, чего я хочу.
 – 
ZeroFlex
5 Июн 2016 в 03:34
Похоже на странную причину отказаться от подхода, когда $routeParams и $location.search() ngRoute несложно использовать. Не только это, но даже если один человек установит маршруты, контроллеры все равно будут работать так же, как при использовании ng-include
 – 
charlietfl
5 Июн 2016 в 03:35

2 ответа

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

$scope.pageNumber = 1;
$scope.setPage = function(pageNumber) {
    $scope.pageNumber = pageNumber
};

Затем вызовите функцию контроллера, передав ей нужную страницу.

<button ng-click="setPage(1)">Show Page 1 Content</button>
<button ng-click="setPage(2)">Show Page 2 Content</button>
1
Kenny Pederson 5 Июн 2016 в 03:03
Думаю, есть некоторая путаница. Я не хочу устанавливать значение переменной с помощью ng-click, но устанавливаю значение ng-click на основе значения переменной. Просто, если x = "page1", то ng-click = x должно быть таким же, как ng-click = "page1"; это то, чего я хотел достичь.
 – 
ZeroFlex
5 Июн 2016 в 03:17
Пример без причины в вашем коде, который, по вашему мнению, не работает, не должен работать ng-click="template=page", но все же лучше использовать функцию и поместить логику в контроллер, как показано в этом ответе. Используйте маршрутизатор ... этой проблемы не существует, и у вас есть хорошо задокументированные примеры для работы
 – 
charlietfl
5 Июн 2016 в 03:25
Та же идея, просто передайте значение из контроллера вместо статического числа. plnkr.co/edit/pJwGsDlrkiSQAvZU5CyM?p=preview
 – 
Kenny Pederson
5 Июн 2016 в 03:31
Позвольте мне попытаться объяснить это еще раз более ясно на вашем собственном примере. Что, если бы я хотел изменить значение - «setPage (desirePage)» на что-то вроде - «setMeNow (NoPageDesired)» при нажатии кнопки. В вашем примере вы изменили значение с помощью ng-click, но Клири сказал: я не хочу изменять значение какой-либо переменной, но значение директивы. Я сожалею об этом. Большое спасибо за твои усилия, приятель.
 – 
ZeroFlex
5 Июн 2016 в 03:48

Попробуй это:

    <button ng-click="template='page1.html'">Show Page 1 Content</button>
    <button ng-click="template='page2.html'">Show Page 2 Content</button>
    <ng-include src="template"></ng-include>

Хотя я настоятельно рекомендую использовать директивы или компоненты вместо ng-include.

Plunker

0
GBa 5 Июн 2016 в 03:07
Вот что я использовал. Но я хочу, чтобы значение ng-click изменялось в зависимости от значения переменной.
 – 
ZeroFlex
5 Июн 2016 в 03:10
Это невозможно, AFAIK. Вы запрашиваете инструкцию eval (), которая, вероятно, слишком опасна для безопасности. Я бы посмотрел на ответ Кенни и перенес логику в функцию.
 – 
GBa
5 Июн 2016 в 03:11
Ответ Кенни был бы правильным, если бы я хотел установить значение переменной с помощью ng-click. Вы можете увидеть комментарий к его ответу. Что касается функции eval (), я знаю проблему безопасности, все еще пробовал, у меня не сработало.
 – 
ZeroFlex
5 Июн 2016 в 03:23
Это невозможно сделать.
 – 
GBa
5 Июн 2016 в 03:28