【问题标题】:Loop viewmodel display pattern images on select change选择更改时循环视图模型显示模式图像
【发布时间】:2015-08-26 06:09:15
【问题描述】:

我正在使用以下模型加载 3 个选择:

        var viewModel = function(){
                var self = this;
                self.makes = [
                        {id: 1, name: 'Northwoods Prestige'},
                        {id:2, name: 'Forest Bay'},
                        {id:3, name: 'Timberland'}
                ];

                self.types = [
                        {id: 1, make:1, name:'Special Reserve 138', patterns:['11.jpg','12.jpg']},
                        {id: 2, make:1, name:'Special Reserve II', patterns:['13.jpg','14.jpg']},
                        {id: 3, make:2, name:'TF 138', patterns:['15.jpg','16.jpg']},
                        {id: 4, make:2, name:'TF II', patterns:['17.jpg','18.jpg']},
                        {id: 5, make:3, name:'RP 25', patterns:['19.jpg','20.jpg']},
                        {id: 6, make:3, name:'LP 25', patterns:['21.jpg','22.jpg']}
                ];

                self.models = [
                        {id:1, make:1,type: 1, name: 'Single Door'},
                        {id: 2, make:1,type: 1, name: 'Double Door'},
                        {id: 3, make:1,type: 2, name: 'Focus'},
                        {id: 5, make:2,type: 3, name: 'Q5'},
                        {id: 6, make:2,type: 3, name: 'Q7'},
                        {id: 7, make:2,type: 4, name: 'A3'},
                        {id: 8, make:2,type: 4, name: 'A4'},
                        {id: 9, make:2,type: 3, name: 'A6'}
                ];

                self.selectedMake = ko.observable();
                self.selectedType = ko.observable();
                self.selectedModel = ko.observable();

                self.carTypes = ko.computed(function(){
                        return ko.utils.arrayFilter(self.types, function(item){
                                return item.make === self.selectedMake();
                        });
                });

                 self.carModels = ko.computed(function(){
                        return ko.utils.arrayFilter(self.models, function(item){
                                return item.make === self.selectedMake() && item.type === self.selectedType();
                        });
                });
        };
        var model = new viewModel();
        ko.applyBindings(model);

HTML:

  <div>
      <select id="make" data-bind="options: makes, value: selectedMake, optionsText : 'name', optionsValue : 'id'"></select><br/>
      <select id="type" data-bind="options: carTypes, value: selectedType, optionsText : 'name', optionsValue : 'id'"></select><br/>
      <select id="model" data-bind="options: carModels, value:selectedModel, optionsText: 'name', optionsValue : 'id'"></select>
  </div>
  <div>
    <div data-bind="foreach: { data: carTypes, as: 'x' }">
        <div data-bind="text: x.patterns"></div>
    </div>
  </div>

每当我更改 select id="make" 时,模型会更改 (foreach),每当我更改 select id="type" 中的值而不是第一个值时,我都会尝试实现这一点。有什么帮助吗?谢谢

【问题讨论】:

    标签: javascript knockout.js knockout-mvc knockout-3.0


    【解决方案1】:

    我在类型选择器中添加了optionsCaption,因此默认情况下它不会选择一个。你可能不想要那个,我不知道。

    <select id="type" data-bind="optionsCaption:'Select...', options: carTypes, value: selectedType, optionsText : 'name', optionsValue : 'id'"></select>
    

    我创建了一个新的计算来从carTypes 获取与selectedType 匹配的条目:

         self.matchingTypes = ko.computed(function () {
             var selectedType = self.selectedType();
             return ko.utils.arrayFilter(self.carTypes(), function (item) {
                 return item.id === selectedType;
             });
         });
    

    我将它用于 foreach:

    <div data-bind="foreach: { data: matchingTypes, as: 'x' }">
        <div data-bind="text: x.patterns"></div>
    </div>
    

    现在只显示与 selectedType 关联的模式。

    要为图案使用图像而不是文本,例如:

    <div data-bind="foreach: { data: matchingTypes, as: 'x' }">
        <div data-bind="foreach: x.patterns">
            <img data-bind="attr:{src:$data}" />
        </div>
    </div>
    

    http://jsfiddle.net/e00suhbo/6/

    【讨论】:

    • 谢谢,它有效!在我将其标记为已解决之前的最后一个问题。正如您在 jsfiddle 中看到的那样,输出为“11.jpg,12.jpg”。如何从该输出中生成 2 张图像?
    猜你喜欢
    • 1970-01-01
    • 2014-06-21
    • 1970-01-01
    • 2014-01-12
    • 2018-06-30
    • 1970-01-01
    • 2016-11-10
    • 2020-09-21
    • 2017-05-04
    相关资源
    最近更新 更多