knockout.js 单击时取消切换活动类

8qgya5xd  于 2022-11-10  发布在  其他
关注(0)|答案(3)|浏览(203)

我有一个knockout应用程序,其中我有一个功能,显示/隐藏页面上的元素,这取决于所选的选项。按钮,已被选中,以激活一个特定的切换将有一个'活动'类,使它'脱颖而出',这是明确可见的,这是所选的选项。我的问题是,我已经创建了一个knockout功能,以切换活动类,但它's触发了所有按钮的活动状态,而不是选定的按钮,我不知道为什么?

var viewModel = function(){
    var self = this;
    self.isActive = ko.observable(false);
    self.toggleActive = function(data, event){
        self.isActive(!self.isActive()); //toggle the isActive value between true/false
    }
}

<button data-bind="click: toggleActive, css : {'activeStyle' : isActive}">Toggle Active</button>
<button data-bind="click: toggleActive, css : {'activeStyle' : isActive}">Toggle Active</button>
<button data-bind="click: toggleActive, css : {'activeStyle' : isActive}">Toggle Active</button>

小提琴:http://jsfiddle.net/amMup/5/

h5qlskok

h5qlskok1#

这三个按钮只有一个视图模型,也就是说只有一个“isActive”标志,所有按钮都绑定到它。
相反,使用一个项目数组和一个foreach循环来呈现每一个项目。

var viewModel = function(){
    var self = this;
    self.items = [
        { isActive: ko.observable(false) },
        { isActive: ko.observable(false) },
        { isActive: ko.observable(false) }
        ];
    self.toggleActive = function(data, event){
        data.isActive(!data.isActive());//toggle the isActive value between true/false
    }
}

var myModel = new viewModel();

ko.applyBindings(myModel);

HTML也被简化了:

<div data-bind="foreach: items">
    <button data-bind="click: $parent.toggleActive, css : {'activeStyle' : isActive}">Toggle Active</button>
</div>

注意使用$parent来访问父对象的binding context。当您在foreach循环中时,绑定上下文是从foreach循环中提取的单个项。通过访问$parent,您可以“到达”包含items属性的对象--在您的示例中,该对象是toggleActive所在的视图模型。
下面是一个更新的小提琴:http://jsfiddle.net/psteele/amMup/6/

cld4siwp

cld4siwp2#

这是因为你把它们都束缚在同一个可观察的东西上。
http://jsfiddle.net/Kohan/fdzqJ/

个J

var viewModel = function(){
    var self = this;
    self.isActive1 = ko.observable(false);
    self.isActive2 = ko.observable(false);
    self.isActive3 = ko.observable(false);

    self.toggleActive = function(data){
        data(!data());
    }
}

var myModel = new viewModel();

ko.applyBindings(myModel);

HTML格式

<button data-bind="click: function(){toggleActive(isActive1)}, css : {'activeStyle' : isActive1}">Toggle Active</button>
<button data-bind="click: function(){toggleActive(isActive2)}, css : {'activeStyle' : isActive2}">Toggle Active</button>
<button data-bind="click: function(){toggleActive(isActive3)}, css : {'activeStyle' : isActive3}">Toggle Active</button>
gcmastyq

gcmastyq3#

另一个道:

<button data-bind="click: function(){setActive('1')}, css:  buttonActive() == '1' ? 'active' : '' ">Toggle Active</button>

var viewModel = function(){
    var self = this;
    self.buttonActive = ko.observable(false);
    self.buttonActive = function(index){
        self.buttonActive(index);
    }
}

var myModel = new viewModel();

ko.applyBindings(myModel);

相关问题