0

我有一个选择控件,我有一个订阅。当我不应用剑道样式时,控件按预期工作,订阅代码触发一次并且不会重新触发 onBlur 或任何其他原因。当我确实应用了 kendoDropDownList 时,订阅的行为始终如一

$("select").kendoDropDownList();

不稳定的行为是选择一个值,订阅触发。单击另一个控件,订阅事件再次触发并且值未定义,即使选择控件将值显示为未更改。随后的选择会按预期触发订阅。使用剑道时,在选择控件上使用向下/向上箭头也不会触发。

<select id="newExperienceFrequency"   data-bind="value: frequency, options: $root.controls.frequencies,  optionsText: 'name', optionsValue: 'id', optionsCaption: 'Select', event: { mouseover: mouseoverFrequency, mouseout: mouseoffFrequency }" class="select frequencyTip" title="foo"></select>


    self.proficiency.subscribe(function () {
        self.proficiencyId = self.proficiency();
        console.log('proficiency subscribed: ' + self.proficiency());
        my.setCounterHint($("#newExperienceFrequency").val(), self.proficiency());

        var tip = "Don't just list those skills your strongest in. It's just as important to add new skills you are aquiring!";
        var result = $.grep(my.ajaxData.member.Proficiencies, function (e) { return e.Id == self.proficiency(); });
        if (result.length == 0) {
            // not found
        } else if (result.length == 1) {
            // access the foo property using result[0].foo
            tip = result[0].Name + ':\nAutonomy: ' + result[0].Autonomy + '\nContext: ' + result[0].nContext + '\nKnowledge: ' + result[0].Knowledge + '\nWorkmanship: ' + result[0].Workmanship;
        } else {
            // multiple items found
        }
        $(".proficiencyTip").attr('title', tip).attr('alt', tip);
        $(".proficiencyQuestionMark").fadeIn('slow');
    }); 

这是一个已知问题,还是我只是做错了什么?我是否通过尝试将 Kendo 与 Knockout 一起使用来为自己做更多的工作?如果我只是使用剑道并放弃淘汰赛,这些问题会消失吗?

4

1 回答 1

0

我对 KendoUI 的了解不如对淘汰赛的了解。但是,如果我不得不猜测,那将是剑道在元素上触发了一个更改的事件,这导致淘汰赛的触发次数比通常情况下要多。

我建议为您的订阅提供新值的参数,而不是self.proficiency()在订阅中引用。然后您可以检查该值是否在订阅中定义。

另外,我建议重新评估一种避免在视图模型中执行 jquery 的方法。如果您必须执行 jquery,请制作自定义动画或新绑定。您很可能可以将您的 Ui 绑定到 VM 中的另一个属性并解耦您的视图/虚拟机。

例如,问号元素可以绑定到布尔可观察对象。制作自定义绑定fadeVisible。我依稀记得文档中有一个样本。制作起来并不难。(提示: http: //knockoutjs.com/examples/animatedTransitions.html

self.proficiency.subscribe(function(val) {
    if (typeof(val) === 'undefined')) {
        return;
    }
});
于 2012-12-28T16:17:59.250 回答