Как передать динамические значения в «ng-if»?

У меня проблема с передачей динамических значений в "нг-если". Если я передаю статическое значение, оно работает, но когда я передаю динамические значения путем конкатенации двух переменных, оно не работает. Я пробовал с кодом ниже:

<ul class = "list cart">
  <li class = "cart_item"
      ng-repeat = "product in orderInfo.products track by product.product_id"
      data-id = "\{{product.product_id}}" id = "items_list_{{product_id}}">
    <button
      ng-click = "removeItem(product.product_id)"
      // If I pass a static value like "removed_31460" then its working.
      ng-if = "removed_31460 == 'added'"
      // If tried to pass a dynamic value like below I am getting error as token not accepted.
      **ng-if = "removed_+product.product_id == 'added'"**
      data-product-id = "{{item_id}}"
      class = "remove" data-id = "\{{ product.product_id }}">
      Remove
    </button>
  </li>
</ul>

Примечание: "removed_31460" определен в моем app.js файле.

Вот исполняемый код:

function TodoCtrl($scope) {
    $scope.products = [
        {product_id:'123'},
        {product_id:'234'},
    ];
    let removed_id = '';
    for (let i = 0; i < $scope.products.length; i++) {
        removed_id = 'removed_'+ $scope.products[i].product_id;
        $scope[removed_id] = 'added';
    }
    $scope.removeItem = function(product_id) {
        alert('in ' + product_id);
    };
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.0.3/angular.min.js"></script>
<div ng-app>
<div ng-controller = "TodoCtrl">
<ul class = "list cart">
  <li class = "cart_item" ng-repeat = "product in products" data-id = "\{{product.product_id}}" id = "items_list_{{product_id}}">
    <button
      ng-click = "removeItem(product.product_id)"
      // If I pass a static value like "removed_31460" then its working.
      ng-if = "removed_23445 == 'added'"
      // If tried to pass a dynamic value like below I am getting error as token not accepted.
      **ng-if = "removed_+product.product_id == 'added'"**
      data-product-id = "{{item_id}}"
      class = "remove" data-id = "\{{ product.product_id }}">
      Remove
    </button>
  </li>
</ul>
</div>
</div>

Это не работает, потому что это не работает и в JavaScript. Ваше выражение эквивалентно $scope.removed_ + $scope.product.product_id == 'added'.

JB Nizet 09.04.2019 08:01

product.product_id получает из li ng-repeat, а не из $scope.

Ajay Reddy 09.04.2019 08:04

О, да. Тем не менее, это эквивалентно $scope.removed_ + product.product_id == 'added'. Все еще не то, что вы хотите, я думаю.

JB Nizet 09.04.2019 08:05

HTML-код выше находится в моих обработчиках и $scope в app.js. Если я объявлю «removed_31460» добавленным в $scope, я смогу напрямую использовать «removed_31460» в своих обработчиках. Во всяком случае, я попытался, как вы сказали, но все равно не повезло.

Ajay Reddy 09.04.2019 08:12
я пробовал как ты сказал: Я никогда ничего не советовал использовать. Я пытаюсь объяснить вам, что сделал ты. Вы объединяете две переменные в своем выражении. И одного из них (removed_) не существует. Если вы хотите получить доступ к переменной по имени, используйте Map.
JB Nizet 09.04.2019 08:17
Знаете ли вы, что директивы являются одной из самых мощных и универсальных функций Angular?
Знаете ли вы, что директивы являются одной из самых мощных и универсальных функций Angular?
Директивы позволяют расширять HTML новыми элементами и атрибутами и даже создавать собственные структурные директивы для манипулирования DOM. С...
Разница между Angular и React
Разница между Angular и React
React и AngularJS - это два самых популярных фреймворка для веб-разработки. Оба фреймворка имеют свои уникальные особенности и преимущества, которые...
0
5
2 416
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Попробуйте: ng-if = "removed_{{product.product_id}} == 'added'".

если вы динамически добавляете идентификатор, то привязка должна быть выше, поэтому, если идентификатор продукта равен 201, выражение будет удалено_201

Я тоже устал, как и выше, но я получаю <!-- ngIf: removed_ == 'added' -->. Нет productID после удаленный_

Ajay Reddy 09.04.2019 08:10

вы HTML как шаблон или что-то вроде пыли и т. д.? Вы можете распечатать свой productID в html и увидеть его, то есть не внутри кнопки attr, распечатать product.product_id и посмотреть, придет ли значение. сделай скрипку и поделись

optimus 09.04.2019 08:17

JsFiddle: jsfiddle.net/pguhL2es

Ajay Reddy 09.04.2019 08:51

Зачем это пробовать? Пожалуйста, добавьте некоторые пояснения к этому коду, чтобы другие могли извлечь из него уроки.

Nico Haase 09.04.2019 09:25

@ajaj: ты пытаешься показать и скрыть кнопку в скрипке? не в состоянии получить то, что вы хотите достичь в скрипке

optimus 09.04.2019 10:47

Попробуйте использовать это:

ng-if = "removed_[product.product_id] == 'added'"

Может быть, это поможет вам. Добавление JSFIDDLE будет полезно.

Попробуйте следующие возможности:

ng-if = " 'removed_' product.product_id == 'added' " (удаленный в одинарных кавычках)

ng-if = " 'removed_'[product.product_id] == 'added' " (удаленный в одинарных кавычках и переменные $scope в фигурных скобках)

Попробуй это : http://jsfiddle.net/d60rm5pw/

Я помню, как использовал этот код где-то. Если бы вы могли предоставить JSFIDDLE?

rahim.nagori 09.04.2019 08:23

Поместите удаленный в одинарные кавычки ng-if = " 'removed_' product.product_id == 'added' "

rahim.nagori 09.04.2019 08:30

привет, @AjayReddy, посмотри: ng-if = "'removed_'product.product_id == 'добавлено'"

rahim.nagori 09.04.2019 08:39

Давайте продолжить обсуждение в чате.

Ajay Reddy 09.04.2019 09:00

И как это сделать? Я думаю, что ваша проблема решена с помощью последнего кода, который я предоставил. Если это так, пожалуйста, проголосуйте. :)

rahim.nagori 09.04.2019 09:01

Еще не решен. Пожалуйста, проверьте ссылку jsfiddle, которую я отправил

Ajay Reddy 09.04.2019 09:06
Ответ принят как подходящий

Использовать:

ng-if = "this['removed_' + product.product_id] == 'added'"

Идентификатор this может использоваться для обозначения $scope.

Для получения дополнительной информации см.


Код можно изменить, чтобы создать хэш с именем statusById:

function TodoCtrl($scope) {
    $scope.products = [
        {product_id:'123'},
        {product_id:'234'},
    ];

    $scope.statusById = {};
    $scope.products.forEach(p => $scope.statusById[p.product_id] = 'added');

    $scope.removeItem = function(index) {
        $scope.products.splice(index,1);
        $scope.statusById[$scope.products[index].productId] = 'removed';
    };
}

Тогда шаблон может использовать $index:

<li ng-repeat = "product in products" id = "items_list_{{product_id}}">
    <button ng-click = "removeItem($index)"
            ng-if = "statusById[product.product_id] == 'added'"
    >
      Remove
    </button>
</li>

Для получения дополнительной информации см.

Другие вопросы по теме