knockout订阅选择与KendoUI不一致的触发

时间:2012-12-28 15:17:42

标签: knockout.js kendo-ui

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

$("select").kendoDropDownList();

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

<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');
    }); 

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

1 个答案:

答案 0 :(得分:0)

我不像KendoUI那样熟悉我的淘汰赛。但是,如果我不得不猜测剑道会在元素上触发一个更改的事件,这会导致击倒比正常情况更多。

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

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

例如,questionmark元素可以绑定到布尔值observable。制作自定义绑定fadeVisible。我依稀记得有文档的文档。这不难做到。 (提示:http://knockoutjs.com/examples/animatedTransitions.html

self.proficiency.subscribe(function(val) {
    if (typeof(val) === 'undefined')) {
        return;
    }
});