1

我正在编写一个小型应用程序来管理 Trello Boards 仅在几个方面,例如在列表中对卡片进行排序、根据到期日期和/或标签移动/复制卡片、定期归档列表以及基于标签生成报告,等等。因此,我一直在围绕 Manatee.Trello 库构建一个外观,以简化我的服务界面。

我已经对图书馆感到满意,而且事情相对顺利。但是,我在 Card 类上编写了一个扩展方法来在列表内或列表之间移动卡片,另一个方法重复调用此扩展方法以将所有卡片从一个列表移动到另一个列表。

我的问题是,当在几个 7 张卡合​​二为一的虚拟列表上运行代码时,它可以毫无错误地完成,但至少一张卡实际上并没有被移动(尽管多达 3 张卡未能移动)。我不知道这是因为我的动作太快了,还是我需要调整 TrelloConfiguration.ChangeSubmissionTime,或者什么。我试过玩延迟,但没有帮助。

这是我的调用代码:

public void MoveCardsBetweenLists(
    string originListName,
    string destinationListName,
    string originBoardName,
    string destinationBoardName = null)
{
    var fromBoard = GetBoard(originBoardName); // returns a Manatee.Trello.Board

    var toBoard = destinationBoardName == null
                  || destinationBoardName.Equals(originBoardName, StringComparison.OrdinalIgnoreCase)
                      ? fromBoard
                      : GetBoard(destinationBoardName);

    var fromList = GetListFromBoard(originListName, fromBoard); // returns a Manatee.Trello.List from the specified Board
    var toList = GetListFromBoard(destinationListName, toBoard);

    for (int i = 0; i < fromList.Cards.Count(); i++)
    {
        fromList.Cards[i].Move(1, toList);
    }
}

这是我在 Manatee.Trello.Card 上的扩展方法:

public static void Move(this Card card, int position, List list = null)
{
    if (list != null && list != card.List)
    {
        card.List = list;
    }

    card.Position = position;
}
4

1 回答 1

1

我创建了一个复制您想要的功能的测试。基本上,我在我的板上创建了 7 张卡片,将它们移动到另一个列表,然后删除它们(只是为了保持初始状态)。

private static void Run(System.Action action)
{
    var serializer = new ManateeSerializer();
    TrelloConfiguration.Serializer = serializer;
    TrelloConfiguration.Deserializer = serializer;
    TrelloConfiguration.JsonFactory = new ManateeFactory();
    TrelloConfiguration.RestClientProvider = new WebApiClientProvider();

    TrelloAuthorization.Default.AppKey = TrelloIds.AppKey;
    TrelloAuthorization.Default.UserToken = TrelloIds.UserToken;

    action();

    TrelloProcessor.Flush();
}

#region http://stackoverflow.com/q/39926431/878701

private static void Move(Card card, int position, List list = null)
{
    if (list != null && list != card.List)
    {
        card.List = list;
    }

    card.Position = position;
}

[TestMethod]
public void MovingCards()
{
    Run(() =>
            {
                var list = new List(TrelloIds.ListId);
                var cards = new List<Card>();
                for (int i = 0; i < 10; i++)
                {
                    cards.Add(list.Cards.Add("test card " + i));
                }

                var otherList = list.Board.Lists.Last();

                for(var i = 0; i < cards.Count; i++)
                {
                    Move(card, i, otherList);
                }

                foreach (var card in cards)
                {
                    card.Delete();
                }
            });
}

#endregion

快速提问:你是TrelloProcessor.Flush()在执行结束前打电话吗?如果你不这样做,那么当应用程序结束时,一些更改可能会保留在请求处理器队列中,因此它们永远不会被发送。有关更多信息,请参阅我的处理请求的 wiki 页面。

另外,我注意到您将1其用作每次移动的位置。通过这样做,您最终会得到一个不可靠的排序。Trello 使用的位置数据是浮点数。要将一张牌放在另外两张牌之间,只需取其他牌的平均值。在您的情况下,(如果目标列表为空),我建议发送 indexer 变量进行排序。如果目标列表不为空,您需要根据列表中的其他卡片计算新位置(通过 Trello 使用的平均方法)。

最后,我喜欢你的扩展代码。如果您有您认为对添加到库有用的想法,请随时 fork GitHub 存储库并创建拉取请求。

于 2016-10-08T21:52:15.700 回答