【问题标题】:how to get a value based on a selection in knockoutjs如何根据knockoutjs中的选择获取值
【发布时间】:2015-03-18 23:49:20
【问题描述】:

我正在使用敲除从 API 中获取一些数据来填充我的文本框。当您选择药物时,我想从 API 中获取单价。我怎样才能做到这一点?

<div class="control-group">
    <label class="control-label">Drug:</label>
    <div class="form-horizontal">
        <select id="Drug_ddl" data-bind="options: drugs, optionsText: function (item) { return item.Description; }, value: selectedDrug" class="input-xlarge"></select>
    </div>
</div>


<div class="control-group">
    <label class="control-label">Unit Price:</label>
    <div class="form-horizontal">
        <input type="number" data-bind="value: unitPrice" step="0.01" class="input-xlarge" id="UnitPrice_txt" />
    </div>
</div>

<div class="control-group">
    <label class="control-label">Quantity:</label>
    <div class="form-horizontal">
        <input type="number" data-bind="value: quantity" step="1" class="input-xlarge" id="Qty_txt" />
    </div>
</div>

<div class="control-group">
    <label class="control-label">Cost:</label>
    <div class="form-horizontal">
        <input type="text" data-bind="value: drugcost" readonly="readonly" step="0.01" class="input-xlarge" id="Cost_txt" />
        <input type="button" id="AddDrugs_btn" data-bind="click: addDrug" class="btn btn-primary" value="Add" />

    </div>
</div>

这是 viewModel 的代码:

var claimEntryViewModel = function () {

    var drugs = ko.observableArray([]);
var unitPrice = ko.observable('0.00');
    var quantity = ko.observable('1');
    var drugcost = ko.computed(function () {
        return quantity() * unitPrice();
    });

 var loadDrugs = function () {
        url = apiServerUrl + "Items/";

        $.ajax({
            url: url,
            headers: { 'Access-Control-Allow-Origin': '*' },
            contentType: 'application/json',
            dataType: 'json',
            type: 'GET',
            crossDomain: true,
            success: function (data) {

                drugs(data);

            },
            error: function (data) {
                console.log("Is not answered");
                console.log(data);
            }
        });
    }

 var selectedDrug = ko.observable();

    var addDrug = function () {

        var match = ko.utils.arrayFirst(claimDrugs(), function (item) {
            return selectedDrug().ID === item.Id;
        });

        if (!match) {
            claimDrugs.push({
                Id: selectedDrug().ID,
                Description: selectedDrug().Description,
                unitPrice: selectedDrug().SalesPrice,
                quantity: quantity(),
                drugcost: drugcost(),
            });
        } else {
            errorMessage("Already exists!");
        }
    }

return {
        drugs: drugs, 
        addDrug: addDrug,
        selectedDrug: selectedDrug,
        unitPrice: unitPrice,
        quantity: quantity,
        drugcost: drugcost,
    }

}

有人请给我一个可以做到这一点的代码,我对淘汰赛还很陌生,真的不知道该怎么做。谢谢

【问题讨论】:

  • 好吧change 在选项正确,所以使用subscribe 值绑定观察到的药物下拉列表(即在 selectedDrug 上)。在 subscribe 内部进行 ajax 调用并填写 untiprice 。可能没有问题包括 optionsValue 。欢呼
  • 请发布您的视图模型代码
  • @supercool 你能给我一个示例代码吗?我对淘汰赛有点陌生,对订阅不太了解
  • 请参考 ko 文档,这对 ko 的新手开发者有很大帮助。干杯。

标签: javascript knockout.js


【解决方案1】:

超级酷是对的,订阅是处理这个问题的好方法。

    selectedDrug.subscribe(function (newValue) {
                neededInfo(getSelectedDrugInfoFromApi(newValue));
            });

这将在每次 selectedDrug 可观察值更改时调用 getSelectedDrugInfoFromApi(),并更新所需的信息可观察值。 请记住,不要在 subscribe 函数中更新 selectedDrug 值,因为它会创建一个循环。

【讨论】:

  • 在这种情况下,getSelectedDrugInfoFromApi() 将成为一个函数,所需的信息是我的 unitPrice。对吗?
  • 正确,如下所示: unitPrice(getUnitPriceByDrug(newValue));将调用 getUnitPriceByDrug() ,其中 newValue 参数等于新选择的值,并将其分配给 unitPrice
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-16
  • 2017-05-01
  • 2020-06-10
  • 2012-05-19
相关资源
最近更新 更多