用于遍历的jQuery .find()或.next()?

时间:2016-04-28 18:42:59

标签: jquery knockout.js

我有一些代码,我使用jQuery在循环中的特定项目上执行函数,因为它必须在页面上显示许多相同的内容。

最终我试图在点击锚标签时显示第二部分,并隐藏第一部分。然后我将颠倒第二部分内单击按钮的过程。

我们一直在使用jQuery之类的东西,比如.next(),。find(),。nearest()和.prev()来遍历element.target(click)来操纵特定容器而不影响任何其他容器在共享相同选择器的页面上。

所以,对于这段代码,到目前为止我遇到了错误,并且无法弄清楚这个代码的遍历难题。

        <ul data-bind="foreach: { data: FilteredThings, as: 'Thing' }">
            <li>
                <header>
                    <a class="focus-element-flag" data-bind="click: $parent.ShowSection1hideSection2">
                        <div>
                            <div></div>
                            <div>
                                <div></div>
                            </div>
                            <div>
                                <div><label></label></div>
                            </div>
                        </div>
                    </a>
                </header>
                <section id="section1" class="currently-shown">
                     //some content
                </section>
                <section id="section2" class="currently-hidden">
                    <div>
                        <button class="closeButton" data-bind="click: $parent.ShowSection1hideSection2">
                            <span>Close</span>
                        </button>
                    </div>
                    <table>
                       //some content
                    </table>
                </section>
            </li>
        </ul>

然后我有一个类似的功能:

vm.ShowSection1hideSection2 = function (Event) {
    $(Event.target).find(".currently-shown").css('display', 'none');
    $(Event.target).find(".currently-hidden").css('display', 'block');
}

现在我知道这个函数是不正确的,但它是我尝试使用.next(),. find(),。siblings()等的一个例子。

我将所有html标签留在了锚标签内,以显示可能存在多个“目标”,但看起来他们都在寻找使用jQuery的正确选择器,我很高兴。

任何人都有关于在我的函数中使用哪种jQuery组合的建议?先感谢您。我几个小时以来一直在研究和做一些追踪和错误。

1 个答案:

答案 0 :(得分:1)

由于你在使用Knockout,我的建议是利用击倒力并保持你的物品分开
示例:https://jsfiddle.net/9aLvd3uw/97/

 var MainViewModel = function() {
        var self = this;
        //Assuming this is your data
        var arrOfObj = [{name:'Name 1',value:'value 1'},
                        {name:'Name 2',value:'value 2'},
                        {name:'Name 3',value:'value 3'}];
        //For each obj you create a new instance of ItemViewModel 
       self.FilteredThings = ko.observableArray($.map(arrOfObj, function (item) {
         return new ItemViewModel(item);
        }));
    }
      var ItemViewModel = function(data) {
        var self = this;
        self.Name = ko.observable(data.name);
        self.Value = ko.observable(data.value);
        self.ShowSection1 = ko.observable(true);
        self.ShowSection2 = ko.observable(false);
        self.ShowSection1hideSection2 = function (){
          // here your logic to show or hide different section  
            self.ShowSection1(!self.ShowSection1());
            self.ShowSection2(!self.ShowSection2());
        }
    }
    ko.applyBindings(MainViewModel);