Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript js因变量选择_Javascript_Knockout.js - Fatal编程技术网

Javascript js因变量选择

Javascript js因变量选择,javascript,knockout.js,Javascript,Knockout.js,[请参见底部的更新] 我正在尝试进行敲除依赖选择,它旨在通过这些属性进行“产品”选择,例如,产品可以有“大小”和“材质”,如果我选择了“大小”,则敲除脚本向后端发出请求,并检索可用于所选大小的“材质”,换句话说,如果选择了属性,过滤掉其他属性以仅显示可用值(“所有尺寸”:1,2,3,4,5;“铝”:1,4) 属性列表是完全动态的,大约有80个属性可以以任意方式链接到产品 对于这种情况有什么“最佳实践”吗 我正试图用这样的代码来解决它,但还没有成功: var ViewModel = functio

[请参见底部的更新]

我正在尝试进行敲除依赖选择,它旨在通过这些属性进行“产品”选择,例如,产品可以有“大小”和“材质”,如果我选择了“大小”,则敲除脚本向后端发出请求,并检索可用于所选大小的“材质”,换句话说,如果选择了属性,过滤掉其他属性以仅显示可用值(“所有尺寸”:1,2,3,4,5;“铝”:1,4)

属性列表是完全动态的,大约有80个属性可以以任意方式链接到产品

对于这种情况有什么“最佳实践”吗

我正试图用这样的代码来解决它,但还没有成功:

var ViewModel = function(data) {
    var self = this;
    self.data = data;
    self.attributes = ko.observableArray();
    self.data.forEach(function(item, i, a) {
        // I passed .self to catch it later
        // in products as view_model.attributes().
        self.attributes.push(new VariableProduct(item, self));
    })
};

var VariableProduct = function(item, view_model) {
    var self = this;
    self.attribute_name = ko.observable(item.name);
    self.attribute_value = ko.observable('--');

    // list of attribute values
    self.attribute_values = ko.computed(function() {
        var result = {};
        view_model.attributes().forEach(function(attribute, i, a) {
            // here I try to filter each attributes lists by values
            // it doesn't work well
            if (attribute.attribute_name() != self.attribute_name() && self.attribute_value() != '--') {
                result = attribute.attribute_values().filter(
                        function(value) {
                            return value.indexOf(self.attribute_value()) >= 0;
                        });
            }
        });
        return result;
    });
};
更新1: 通过Dnyanesh对ko.subscribe()的引用,我已经获得了这些结果,现在还不确定,但有了进展:

更新2: 最后用和插件解决了这个问题


详细信息和答案。

对于从属选择,我认为您可以按以下方式使用订阅

var-vm={
尺码:ko.Array([
{name:'size 1',id:1},
{name:'size 2',id:2},
{name:'size 3',id:3},
{name:'size 4',id:4}
]),
所选尺寸:可观察的ko(0),
};
vm.selectedSize.subscribe(函数(newValue)){
警报('所选大小为-->'+新值)
//此时,调用ajax或后端方法并绑定即将形成的值
});
ko.应用绑定(vm)


有趣的问题,它是否也需要工作,反之亦然?例如,如果选择材质,则在“大小”下拉列表中仅过滤可用大小?或者所有“属性”都链接到一个下拉列表(大小)。。换句话说:“大小”是唯一的独立变量,所有其他变量都是依赖的还是所有属性都是相互依赖的?是的,每个产品放置了大约10-15个过滤器,每个选择都应该在其他选择发生变化时作出反应。不必说实际的代码,我认为彻底考虑设计可能是有用的。我认为您的输出应该是(继续并选中一些框);我不认为完全忽略不可选择的选项是明智的。相反,要让访问者清楚,他的决定通过禁用复选框/勾选复选框来限制他的选择(参见链接)。简言之,我认为你最好使用
收音机
复选框
而不是
选择
我的空间太小了,实际上选择放在产品的分区中,每行有4个产品。现在我正试图用ko.mapping解决它,但也没有成功,更新它时订阅丢失:/it’看起来像我需要的,我将尝试制作一个示例并在这里发布。这样会更好,以便我可以了解确切的问题,并根据示例帮助您。这里的一些结果还不确定,现在需要选择所有其他选择中的第一个匹配项,并避免再次出现效果。我不知道还需要做什么。您希望避免哪些reccurent影响?每个选择都必须更新所有选择,并且当其他选择更新时,后端会出现递归和无限请求计数(我不能说“在更新代码中的值时不要使用订阅”)。