javascript-使用敲除.js将css类绑定到可观察数组item.chosen值

我对Knockout.js相当陌生,所以我可能只是想念一些东西.我正在尝试创建一组用作按钮的div,其中它们的“选定”状态反映了数组中某个项目的子值.

看到这个小提琴:http://jsfiddle.net/bleiddyn/RepnY/

摘抄:

    $('.tag-cell').click(function() {
        var ele = event.srcElement.textContent;
        var match = ko.utils.arrayFirst(self.Tags(), function(item) {
            if (ele === item.title) {
                item.chosen = !item.chosen;
                return true;
            }
            return false;
        });

        match.chosen = true;
        self.Tags.valueHasMutated();
    });

div的初始显示是正确的.看来我可以使click事件更改可观察数组内的值而不会出现问题.但是,显示的div不会响应于此而更改css类.

我意识到,作为数组中一项的对象的子项本身是不可观察的.但是,我对valueHasMutated()的调用是否应该强制执行此问题?这也可能不是完成行为的最优雅的方法.

任何人都想帮助学习javascript的人吗?

解决方法:

为了更新绑定属性,必须使相关属性可观察.另外,您无需在这里使用jQuery来处理click事件,您可以使用事件绑定来完成此操作:

function item(options) {
    var self = this;
    this.title = ko.observable(options.title);
    this.level = ko.observable(options.level);
    this.chosen = ko.observable(options.chosen);
    this.toggleItem = function () {
        self.chosen(!self.chosen());
    };
}

function myViewModel() {
    var self = this;
    self.Tags = ko.observableArray([
        new item({
        title: 'Tag1',
        level: 'Primary',
        chosen: true
    }),
        new item({
        title: 'Tag2',
        level: 'Primary',
        chosen: false
    }),
        new item({
        title: 'Tag3',
        level: 'Primary',
        chosen: false
    }),
        new item({
        title: 'Tag4',
        level: 'Primary',
        chosen: false
    }),
        new item({
        title: 'OtherTag',
        level: 'Secondary',
        chosen: false
    })]);


    self.PrimaryTags = ko.computed(function() {
        return ko.utils.arrayFilter(this.Tags(), function(tag) {
            return tag.level() === 'Primary';
        });
    }, self);
    self.SecondaryTags = ko.computed(function() {
        return ko.utils.arrayFilter(this.Tags(), function(tag) {
            return tag.level() === 'Secondary';
        });
    }, self);

}

var vm = new myViewModel();
ko.applyBindings(vm);

例子:http://jsfiddle.net/andrewwhitaker/RepnY/1/

上一篇:javascript-将可观察的转换为可观察的


下一篇:浅谈前端响应式设计(一)