【问题标题】:Adding a value from a drop down to any set of values from another drop down in KnockoutJS将下拉列表中的值添加到 KnockoutJS 中另一个下拉列表中的任何一组值
【发布时间】:2015-01-14 18:02:57
【问题描述】:

(更新) 我一直在练习 KOjs,我对一些复杂的事情感到好奇。

Take this example (JSFiddle)

这是原作。有一个文本输出,它的值是从下拉列表中读取的。下拉列表中的每个项目都有一个数值,并且正在格式化(使用 numericJS)到文本中。然后一个字符显示在底部,对应于下拉菜单的 optionText 值。

现在,这就是我所做的:我添加了一个新的下拉菜单,其中还有预定义的值:

var x = 300;
var y = 1234;
var z = 78;

选择标签就在原来的选择标签旁边:

<select id="addThis" data-bind="options: addToThisSet, optionsText: 'numType', value: setNumValue"></select>

<select id="theList" data-bind="options: htmlSelectSet, optionsText: 'theText', value: displayTheValue"></select>


<p><span data-bind="text: charSymbol"></span></p>

我尝试为新的select 标签添加内容数组,格式与原始标签相同(我对此有不好的预感。对吗?)

self.addToThisSet = [{
        numType: "item 1",
        NumValue: x
    }, {
        numType: "item 2",
        NumValue: y
    }, {
        numType: "item 3",
        NumValue: z
    }];
    self.setNumValue = ko.observable();

    self.htmlSelectSet = [{
        theText: "alpha",
        theValue: num1
    }, {
        theText: "bravo",
        theValue: num2
    }];
    self.displayTheValue = ko.observable();

我的目标很简单:setNumValue()第 1 项或第 2 项或第 3 项)上选择的任何值都将添加到 displayValue() 上设置的任何值(alpha 或 bravo) 并将结果输出到 &lt;h4 data-bind="text: sumOfValue"&gt;&lt;/h4&gt;

我认为这就像制作另一个 ko.computed 一样简单,添加所选变量并返回它们:

self.sumOfValue = ko.computed(function () {
        sumCont = numeral(self.setNumValue() + self.displayTheValue()).format('0,0');
        return sumCont;
    });

但显然它不起作用。 This is what I'm trying to add and do (and failed) (JSFiddle)

为此我需要一个欧比旺克诺比。帮助! :(

================================ (上一个)

我有这个开始:http://jsfiddle.net/yku33mtq/1/

在那个 Fiddle 上,我在 Select 下拉列表中动态显示了一个数字值 - 然后在底部的 Select 下拉列表中显示一个字符来指定您的选择。

我尝试在号码旁边添加另一个select 下拉菜单,但它坏了:(

<h4 data-bind="text: sumOfValue"></h4><select id="addThis" data-bind="options: addToThisSet, optionsText: 'numType', value: setNumValue"></select>

<select id="theList" data-bind="options: htmlSelectSet, optionsText: 'theText', value: displayTheValue"></select>


<p><span data-bind="text: charSymbol"></span></p>

基本上,新的下拉菜单也会有数字值,这些数字取决于您的选择,将从下一个 select 下拉菜单添加到当前数字。

Fiddle

当我在 HTML 上添加新的select 时,脚本似乎也开始失败,甚至还没有在 JS 上放置更改 (http://jsfiddle.net/yku33mtq/5/):/

在 KnockoutJS 中添加两个可以动态的下拉菜单的正确方法和规则是什么?

【问题讨论】:

  • 检查浏览器的javascript控制台!您将看到错误:'Uncaught ReferenceError: setNumValue is not defined' 这是来自您的sumOfValue 计算。需要写的地方:sumCont = numeral(self.setNumValue() + self.displayTheValue()).format('0,0');jsfiddle.net/0c96mwLp
  • 我还尝试将 setNumValue().numValue 添加到其中,并返回“未定义”错误。嗯...看起来整体结构很糟糕,一旦退出变量声明,它就无法再读取数值了。
  • @vm7488 你有没有像这样修改 sumOfValue 计算函数:jsfiddle.net/s05sL1ke
  • 是的,我做到了。现在我对结构的唯一问题是让它读取数字并总结它们。我高度怀疑视图模型的整个结构需要改变:/

标签: javascript jquery knockout.js


【解决方案1】:

您只是忘记访问您计算的对象属性。 在您的选择中,整个对象被插入到 value 绑定的 observable 中。

因此,您需要访问self.setNumValue().NumValue

我做了一个工作小提琴:http://jsfiddle.net/yku33mtq/9/

HTML:

<h4 data-bind="text: sumOfValue"></h4>
<select id="addThis" data-bind="options: addToThisSet, 
                                optionsText: 'numType',     
                                value: setNumValue"></select>
<select id="theList" data-bind="options: htmlSelectSet, 
                                optionsText: 'theText',
                                value: displayTheValue"></select>
<p><span data-bind="text: charSymbol"></span></p>

JS:

function thisViewModel() {
    var self = this;

    self.addToThisSet = [{
        numType: "item 1",
        NumValue: 300
    }, {
        numType: "item 2",
        NumValue: 1234
    }, {
        numType: "item 3",
        NumValue: 78
    }];
    self.setNumValue = ko.observable();

    self.htmlSelectSet = [{
        theText: "alpha",
        theValue: 35450
    }, {
        theText: "bravo",
        theValue: 2450
    }];
    self.displayTheValue = ko.observable();

    self.sumOfValue = ko.computed(function () {
        var numValue = self.setNumValue();
        var display = self.displayTheValue();
        if (numValue && display) {
            return numValue.NumValue + display.theValue;
        }
    });

    self.charSymbol = ko.computed(function () {
        if (self.displayTheValue()) {
            if (self.displayTheValue().theText == "alpha") {
                return "A";
            }
            if (self.displayTheValue().theText == "bravo") {
                return "B";
            }
        }
        return null;
    });

}

ko.applyBindings(new thisViewModel());

【讨论】:

  • 不错!你的意思是jsfiddle.net/yku33mtq/8 无论如何,我认为视图模型是错误的,它只是一个错误的变量调用。谢啦!对此,我真的非常感激。所以基本上,我有计算变量来获取两个空白变量,它们将采用 self.setNumValue();self.displayTheValue(); 然后验证两者是否都有值 - 然后将它们返回为 numValue.NumValue + display.theValue ----很奇怪......为什么不能 self.setNumValue().NumvValue 工作吗??
  • 嘿,@vm7488,随时!我每天大约会犯这种错误72次,哈哈。不过,如果您能接受答案,我将不胜感激:)
  • @vm7488 直接访问变量可以工作...... 如果 你可以保证 observable 永远不会有 undefined 值。然而,当你的 observables 开始为空时,你必须在访问它们之前首先检查它们是否都有值。知道了?此外,在 Knockout 中,通常的做法是在计算声明的顶部声明您需要哪些 observables。这使得依赖关系清晰。
  • 看来我明白了。这行得通(但是,是的,制作 2 个新的更小的 var 将有更短的代码):if (self.setNumValue() &amp;&amp; self.displayTheValue()) { return numeral(self.setNumValue().NumValue + self.displayTheValue().theValue).format('0,0'); } return null;
猜你喜欢
  • 2017-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-16
  • 2019-11-24
  • 2015-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多