【问题标题】:Knockout.js Binding to dropdownlistKnockout.js 绑定到下拉列表
【发布时间】:2013-03-27 08:57:37
【问题描述】:

尝试将数据绑定到下拉列表,

    function EmailTemplate(data) {
        var self = this;
        self.etId = ko.observable(data.email_template_id);
        self.etTypeId = ko.observable(data.email_template_type_id);
        self.etTitle = ko.observable(data.email_template_title);
        self.etContent = ko.observable(data.email_template_content);
        self.etAppYear = ko.observable(data.app_year);
        self.etSubject = ko.observable(data.subject);
        self.etActive = ko.observable(data.active);
    }

    function EmailTemplateViewModel() {
        var self = this;
        self.ETList = ko.observableArray();

        var uri = '/admin/services/EmailTemplateService.svc/EmailTemplates';
        OData.read(uri, function (data, response) {
            $.each(data.results, function (index, item) {
                self.ETList.push(new EmailTemplate(item));
            });
        });
    }
    $(document).ready(function () {
        ko.applyBindings(new EmailTemplateViewModel());            
    });

HTML 标记:

 <select data-bind="options: ETList, value:etId, optionsText: 'etTitle' "class="dropdown"></select>

当我运行它时,我得到: 未捕获的错误:无法解析绑定。 消息:ReferenceError:etIdis 未定义; 绑定值:options: ETList, value:etId, optionsText: 'etTitle'

当我们绑定到下拉列表时,我们应该如何绑定值?绑定后,我们应该如何在 Knockout 中捕获或创建下拉更改事件?

【问题讨论】:

    标签: knockout.js


    【解决方案1】:

    使用&lt;select&gt; 选项时,value 绑定将确定选择哪个选项,通常您会希望在您的视图模型(例如selectedTemplate)中设置一个可观察的对象。然后这个 observable 将自动映射到 observable 数组中的实际对象。设置value: etId 没有意义,因为您的根视图模型中没有etId

    示例: http://jsfiddle.net/antishok/968Gy/

    function EmailTemplateViewModel() {
        var self = this;
        self.ETList = ko.observableArray();
        self.selectedTemplate = ko.observable();
        // ...
    }
    

    HTML:

    <select data-bind="options: ETList, value:selectedTemplate, optionsText: 'etTitle'" class="dropdown"></select>
    

    您可能打算使用 optionsValue: 'etId',这会起作用,但通常是一种不太可取的方法(因为 observable 的值现在将设置为 ID 而不是实际对象)

    【讨论】:

    • 非常感谢@antishok! etId 不在根视图模型中,但 etTitle 也不在。在这种情况下,我应该如何将文本绑定到 etTitle 并将值绑定到 etId,所以当我更改下拉选择时,我可以获得 etID 而不是 etTitle?
    • 好的,我知道了,我可以说 selectedTempalte() && selectedTemplate().etId。所以 selectedTemplate 是绑定到选项的对象,但将 etTitle 显示为文本!!
    • 还是不知道为什么要先调用 selectedTempalte() 再使用 && ,这是干什么用的?
    • 那里需要它,因为起初没有选择任何项目,所以selectedTemplate() === undefined。这和做的一样:selectedTemplate() ? selectedTemplate().etId : undefined。如果没有这个,我们会在尝试访问未定义的.etId 时收到错误
    • 是的!非常感谢您的解释。我还有一个问题,下拉列表实际上是一个触发器,一旦选择更改,然后订阅 selectedTemplate 调用 ajax 来拉回数据,对于初始加载,没关系,我绑定到像 self.ETList 这样的 observableArray,但是我应该怎么做每次下拉更改选择并拉回数据时清理这个 observableArray,现在它继续添加,如果我分配 self.ETList = [];在 ajax 回调之后但在数据绑定之前,我什么都没有得到......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-11
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    • 2011-02-10
    相关资源
    最近更新 更多