【问题标题】:asp.net mvc core knockout.js multiple nested containers not binding properlyasp.net mvc core knockout.js 多个嵌套容器未正确绑定
【发布时间】:2017-08-25 12:23:21
【问题描述】:

这是我正在创建的测试应用程序的代码。

<style>
#scroll-wrapper {
    margin: 5px;
    max-height: 250px;
    overflow: auto;
    vertical-align: top;
}

#thumbnails {
    vertical-align: top;
    padding-bottom: 10px;
    max-height: 500px;
    min-width: 100px;
    overflow-y: hidden;
    overflow-x: scroll;
    white-space: nowrap;
}


.thumbnail-container {
    display: inline-block;
    position: relative;
    line-height: 5px;
    margin: 3px;
    margin-bottom: 15px !important;
}
#abc {
    overflow-y: scroll;
    overflow-x: hidden;
    height: 200px;
}

<form method="post">
    <div data-bind="foreach: lists" id="thumbnails">     
            <div class="thumbnail-container">
                <span data-bind="text:listname"></span><br /><br /><br /><br /><br />
                <div id="abc">                   
                    <ul class="list-group" data-bind="foreach: cardlists">
                        <li class="list-group-item">
                            <span data-bind="text: cardname"></span>
                            <a href="#" data-bind="click: $root.removecard">Del</a>
                        </li>                  
                    </ul>
                    <a href="#" data-bind="click:  $parent.showhideaddcard">Add Card</a><br />                           
                    <div data-bind="visible: $parent.showRenderTimes">
                        <input type="text" data-bind="value: $parent.cardtext" /><br /><br /><br />
                        <input type="button" value="Add" data-bind="click: $parent.addcard" />
                        <input type="button" value="Cancel" data-bind="click: $parent.cancelcard" />
                    </div>   
                </div>             
            </div>
       </div>
    <p>
        <span id="addVar" data-bind="click: addList">Add List</span>
    </p>
    <p class="alignRight">
        <input type="submit" value="Check">
    </p>
</form>


<script type="text/javascript">

        var initialData = [
        {
            listname: "list1",containername :"container1", cardlists: [
            { cardname: "car1111111" },
            { cardname: "caddsdf" }]
        },
        {
            listname: "list2",containername :"container2", cardlists: [
                       { cardname: "card 1" },
                       { cardname: "card 2" }]
        },
        {
            listname: "list3", containername: "container3", cardlists: [
                       { cardname: "card 1" },
                       { cardname: "card 2" }]
            },
        {
            listname: "list4", containername: "container4", cardlists: [
                       { cardname: "card 1" },
                       { cardname: "card 2" }]
            },
        {
            listname: "list5", containername: "container5", cardlists: [
                       { cardname: "card 1" },
                       { cardname: "card 2" }]
            },
        {
            listname: "list6", containername: "container6", cardlists: [
                       { cardname: "card 1" },
                       { cardname: "card 2" }]
            },
        {
            listname: "list7", containername: "container7", cardlists: [
                    { cardname: "card 3" },
                    { cardname: "card 4" },
                    { cardname: "card 5" },
                    { cardname: "card 6" },
                    { cardname: "card 7" },
                    { cardname: "card 8" },
                    { cardname: "card 9" },
                    { cardname: "card 10" },
                    { cardname: "card 11" }]
            },
        { 
            listname: "list6", containername: "container8", cardlists: [
                { cardname: "card 1" },
                { cardname: "card 2" }]
            },
        { 
            listname: "list6", containername: "container9", cardlists: [
                 { cardname: "card 1" },
                 { cardname: "card 2" }]
            },
        {
            listname: "list6", containername: "container10", cardlists: [
                 { cardname: "card 1" },
                 { cardname: "card 2" }]
            },
        { 
            listname: "list6", containername: "container11", cardlists: [
                { cardname: "card 1" },
                { cardname: "card 2" }]
            }
        ];


    var ListModal = function(lists) {
        var self = this;
        self.showRenderTimes = ko.observable(false);
        self.cardtext = ko.observable("ff");
        self.lists = ko.observableArray(ko.utils.arrayMap(lists, function (list) {
            return { listname: list.listname, containername:list.containername, cardlists: ko.observableArray(list.cardlists) };
        }));


        self.addList = function() {
            self.lists.push({
                listname: "abc", 
                containername:"container5",
                cardlists: ko.observableArray([
                    {
                        cardname: "Bungle"
                    },
                    {
                        cardname: "George"
                    },
                    {
                        cardname: "Zippy"
                    }
                ])
            });
        }; 

        self.addcard = function (lists) {
            lists.cardlists.push({
                cardname: self.cardtext             
            });
            self.showRenderTimes(false);
        };
        self.cancelcard = function () {            
            self.showRenderTimes(false);
        };

        self.showhideaddcard = function (lists) {
           self.showRenderTimes(true);
        };

        self.removecard = function (cardlist) {
            $.each(self.lists(), function () { this.cardlists.remove(cardlist) })
        };

        self.save = function ()
        {
        };     
    };
    ko.applyBindings(new ListModal(initialData));
</script>

代码生成这个视图

现在应该发生什么,例如,当我单击图片中的第三张添加卡时,只会出现该文本框,但它正在打开应用程序中的所有添加卡文本框。

显然绑定不正确。有人可以更正我的绑定,所以当我按 no 3 容器添加卡时,只出现没有 3 文本框。我的想法可能是 div abc 是问题,但我无法纠正它。

【问题讨论】:

    标签: asp.net-mvc knockout.js asp.net-core-mvc knockout-3.0


    【解决方案1】:

    绑定工作正常。问题是您只有一个父可观察对象,它存储所有附加卡部分的可见状态。自然,如果每个部分都绑定到相同的 showRenderTimes observable,那么它们将同时被隐藏/可见。您需要为存储其可见性状态的每个列表创建一个 observable。

    您可以将 showRenderTimes 从父 ListModal 移动到各个列表:

    self.lists = ko.observableArray(ko.utils.arrayMap(lists, function (list) {
        return { listname: list.listname, containername:list.containername, cardlists: ko.observableArray(list.cardlists), showRenderTimes: ko.observable(false) };
    }));
    

    然后您需要更新使用它的绑定以删除 $parent 上下文:

    <!--<div data-bind="visible: $parent.showRenderTimes">-->
    <div data-bind="visible: showRenderTimes">
    

    而您的showHideAddCardcancelCard 函数会修改被点击的列表中的变量,因此变为:

      self.cancelcard = function (list) {            
        list.showRenderTimes(false);
      };
    
      self.showhideaddcard = function (list) {
        list.showRenderTimes(true);
      };
    

    Example jsFiddle

    【讨论】:

    • 好的,但是所有新添加的元素都需要是 ko.applyBindings 或类似的东西吗?他们准备好在服务器端发布了吗?
    • 是否需要将它们添加到 DOM 中?
    • 你指的是哪些新添加的元素?
    • 我通过按添加卡添加的新元素
    • 当您单击添加卡片时,一个新对象被添加到卡片列表 observableArray 中,因此它已经是数据绑定集合的一部分。你不需要对任何东西应用绑定。然后 Knockout 会自动添加 DOM 元素,因为它位于 observableArray 中,因此您也不需要向 DOM 添加任何内容。
    猜你喜欢
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多