【问题标题】:How to remove this li element from an ng-repeat?如何从 ng-repeat 中删除这个 li 元素?
【发布时间】:2015-05-01 20:29:34
【问题描述】:

在我的列表下方,底部的 div 之一具有 removePortfolio 函数。该函数的作用是激活ng-hide="tickerRemoved",但仅针对该 1 个列表项,而不是所有列表项。

HTML 要点: https://gist.github.com/leongaban/cf72e5d0229155dd011f
指令要点: https://gist.github.com/leongaban/22a8feb9dbeea0b90135

<ul ng-show="loadingTickersDone" class="tickers-list">

    <li class="ticker-li"
        ng-repeat="ticker in tickers"
        ng-hide="tickerRemoved"
        ng-class="{'selected':toggleTicker.item == $index}"
        ng-mouseleave="hideTickerOptions()">

        <div class="ticker"
             ng-click="toggleTicker.item = $index;
                       selectTicker(ticker.ticker);
                       revealTickerOptions()">
             {{ticker.ticker}}
        </div>

        <div class="add-to-portfolio"
             ng-show="tickerOptions"
             ng-mouseleave="hideTickerOptions()">

             <div ng-show="addOption"
                  ng-click="addPortfolio(ticker.ticker)">+ Portfolio</div>
             <div ng-show="removeOption"
                  ng-click="removePortfolio(ticker.ticker)">- Portfolio</div>
        </div>
    </li>

</ul>

这是指令中的删除函数:

var vs = $scope;

vs.removePortfolio = function(ticker) {
    this.tickerOptions = false;
    ApiFactory.deleteWatchList(ticker).then(function(data) {
        showMessage(ticker+' removed from portfolio!', data.data.status);
        this.tickerRemoved = true;
    });
};

this.tickerRemoved = true; 出现错误我认为这是因为范围在链中较低?

例如,我在此函数中使用this,它工作正常,因为该函数在标记/范围内更高:

vs.revealTickerOptions = function() {
    this.tickerOptions = true;

    if (tickerView === 'all') {
        this.addOption    = true;
        this.removeOption = false;
    }
    else if (tickerView === 'port') {
        this.addOption    = false;
        this.removeOption = true;
    }
};

单击removePortfolio() 功能时,如何仅删除第一个&lt;li class="ticker-li" 项目?

【问题讨论】:

  • this.tickerRemoved = true; 的错误是因为在您的示例中,this 指的是函数。您需要绑定函数:.then(function(data) { /* ... your code */ }.bind(this))。但是,它看起来会影响每个股票 - 您可能想要更像 ticker.removed = true;ng-hide="ticker.removed" 的东西。然后,您还需要在ng-click 代码中传递实际的ticker 对象:ng-click="removePortfolio(ticker)"
  • 啊,这真是个好主意!我刚刚尝试过,但遇到了这个错误Cannot assign to read only property 'removed' of XOM 打算再玩一下
  • 忽略整个第一部分,这只是解释您遇到错误的原因。专注于后半段。传递ticker 对象,我假设它看起来像tickers =[{ticker: "aapl"}],传递整个事物以便您可以添加一个removed 属性:{ticker: "aapl", removed: true},这样您就可以隐藏那个。无论是那个还是实际从数组中删除它,使用slice
  • 哦,成功了! :D 我需要在这里清理一些东西.. 秒,是啊@AlexMA 也有

标签: javascript angularjs angularjs-directive angularjs-scope angularjs-ng-repeat


【解决方案1】:

ng-hide="tickerRemoved" 应该是ng-hide="ticker.tickerRemoved",因为tickerRemoved 是特定股票代码的属性。

ng-show="tickerOptions"相同...从外观上看应该是ng-show="ticker.tickerOptions"

ng-click="removePortfolio(ticker.ticker)"&gt; 应该是ng-click="removePortfolio(ticker)"&gt;,因为您可能想要传递整个ticker 对象。

之后,您将需要更新您的删除代码功能,这样的事情应该可以工作:

vs.removePortfolio = function(tickerObject) {
    var ticker = tickerObject.ticker
    tickerObject.tickerOptions = false;
    ApiFactory.deleteWatchList(ticker).then(function(data) {
        showMessage(ticker+' removed from portfolio!', data.data.status);
        tickerObject.tickerRemoved = true;
    });
};

作为一般观察,您似乎过于依赖thisthis 可能是一个非常令人困惑的关键字,只有在有充分理由这样做且不会在以后的代码维护期间造成混淆时才应该使用(在我看来)。

【讨论】:

  • 我如何只定位 1 ng 重复的项目,而不是所有项目?
  • ticker in vs.removePortfolio = function(ticker) { 仅通过点击的股票代码,所以应该没有问题。
  • 啊,我看到了更多问题。让我改一下答案。
  • 谢谢!太棒了,呵呵...我想我必须做一些奇怪的 $parent $scope 事情或其他事情,哈哈,爱 Angular
猜你喜欢
  • 2017-01-15
  • 2016-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-01
相关资源
最近更新 更多