【问题标题】:Equals not working in Knockout等于不在 Knockout 中工作
【发布时间】:2013-08-14 04:46:52
【问题描述】:

我在使用简单的淘汰赛申请时遇到了一些问题。

型号:

function ContactListVM() {
    var self = this;

    self.selectedContact = ko.observable("");
    self.contacts = ko.observableArray([]);

    self.LoadItems = function () {
        $.ajax({
            url: "Contacts/GetContactList/",
            type: "POST",
            data: { },
            success: function (data) {
               $.each(data.Contacts, function () {
                   self.contacts.push(ko.mapping.fromJS(this));
               });

               if (self.selectedContact() == "") {
                   var data = new Object();
                   data.ID = self.contacts()[0].ID;

                   self.selectContact(data, null);
               }
            }
        });
    }

    self.LoadItems();

    self.selectContact = function (data, event) {
        $.ajax({
            url: "Contacts/GetContact/",
            type: "POST",
            data: { ID: data.ID },
            success: function (data) {
                self.selectedContact(ko.mapping.fromJS(data.Contact));
            }
        });
    }
}

一般来说,我有一个联系人列表,其中包含非常基本的信息和所选联系人的完整模型。所选联系人应在列表中标记为不同的 css 类:

<ul class="contact-list">
    <!-- ko template: { name: 'item-template', foreach: contacts() } -->
    <!-- /ko -->
    <script id="item-template" type="text/html">
        <li class="item" data-bind="click: $root.selectContact, css: { selected: $root.selectedContact().ID == ID() }">
            <span class="contact-name" data-bind="text: Name"></span>
            <span class="contact-name" data-bind="text: $root.selectedContact().ID"></span>
            <span class="contact-name" data-bind="text: ID()"></span>
        </li>
    </script>
</ul>

不幸的是,css: { selected: $root.selectedContact().ID == ID() } 语句不起作用。未选择任何项目。下面还有几行我将这些值绑定到它们在屏幕上看起来相等的跨度。我该如何解决这个问题?

【问题讨论】:

    标签: knockout.js knockout-mapping-plugin


    【解决方案1】:

    http://jsfiddle.net/pUHEf/

    问题是在您选择联系人之前 selectedContact() 是空的,因此没有方法 ID。您需要在逻辑中添加额外的语句。

    <script id="item-template" type="text/html">
            <li class="item" data-bind="click: $root.selectContact, css: { selected: $root.selectedContact() ? $root.selectedContact().ID() === ID() : false }">
                <span class="contact-name" data-bind="text: Name"></span>
                <span class="contact-name" data-bind="text: $root.selectedContact().ID"></span>
                <span class="contact-name" data-bind="text: ID()"></span>
            </li>
    </script>
    

    这行得通,检查小提琴。一个基本的解释 -

    如果以下逻辑为真(用我自己的语言),则将应用所选的类

    if ($root.selectedContact() !== (undefined or null))
    {
        if ($root.selectedContact().ID() === ID())
        {
            set class = selected;
        }
        else { don't set a class }
    }
    else { don't set a class }
    

    【讨论】:

    • 不幸的是,现在我收到“消息:对象没有方法'ID'”,视图(模板)中的绑定是否可能在我的模型中设置 selectedContact 之前进行?如果是应该怎么做?
    • 啊,那么你的 ID 不是可观察的属性。我只是回顾了您分配该属性的位置,实际上它是不可观察的。你能告诉我联系人在映射后是否是可观察的吗?如果您 console.log selectedContact 它会将 ID 显示为一个函数还是一个值?
    • 看起来 ID 是一个函数 - 很奇怪。 ID: function observable()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    • 1970-01-01
    • 2012-09-25
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 2013-06-02
    相关资源
    最近更新 更多