【发布时间】:2018-01-13 18:20:03
【问题描述】:
我是淘汰赛的新手,我正在尝试使用淘汰赛 (v3.2.0) 在我们的应用程序中构建一个新功能。该功能是一个谓词,用户可以在其中选择 LHS 上的属性及其返回类型并指定 RHS 值。每当 LHS 值更改(或其返回类型)时,我想重置 RHS 值但它没有按预期工作。这是代码
function Predicate(){
var _predicate = this;
_predicate.LHS = ko.observable();
_predicate.RHS = ko.observable();
_predicate.LHSReturnType = ko.observable();
_predicate.LHS.subscribe(function (newVal) {
this.RHS(null);
//predicatePropertyMgr.CleanPredicateProperties();
console.log(this.LHS() + ' ---- ' + this.LHSReturnType() + ' ------ ' + this.RHS());
}, _predicate);
_predicate.LHSReturnType.subscribe(function(){
this.RHS(null);
console.log(this.LHS() + ' ---- ' + this.LHSReturnType() + ' ------ ' + this.RHS());
}, _predicate);
_predicate.PropertyNames = ko.computed(function () {
//return predicatePropertyMgr.GetAllProperties();
return [{ DisplayName: 'Status', FieldName: 'StatusID' },
{ DisplayName: 'Due Date', FieldName: 'DueDate' }];
});
_predicate.AllowedReturnTypes = ko.computed({
read: function () {
let propName = _predicate.LHS();
if(propName == 'StatusID')
{
return [{ ID: 1, Name: 'Text' },
{ ID: 2, Name: 'Number' }];
}
if(propName == 'DueDate')
{
return [{ ID: 3, Name: 'Date' }];
}
return [];
},
deferEvaluation: true
});
_predicate.PropertyOptions = ko.computed({
read: function () {
return [{ displayText: 'Any', value: 0 },
{ displayText: 'New', value: 1 },
{ displayText: 'InProgress', value: 2 }];
},
deferEvaluation: true
});
_predicate.RHSControlType = ko.computed({
read: function () {
let propName = _predicate.LHS();
if (propName == 'StatusID') {
return 'combo';
}
if (propName == 'DueDate') {
return 'textbox';
}
return 'textbox';
},
deferEvaluation: true
});
};
var vm = new Predicate();
ko.applyBindings(vm);
console.log(vm.LHS() + ' ---- ' + vm.LHSReturnType() + ' ------ ' + vm.RHS());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<select data-bind="options:PropertyNames, value: LHS, optionsText:'DisplayName', optionsValue:'FieldName'"></select>
<!--
<select data-bind="options: AllowedReturnTypes, optionsText:'Name', optionsValue:'ID', value: LHSReturnType"></select>
-->
<!--ko if: RHSControlType() == 'textbox' || RHSControlType() == 'textArea'-->
<input type="text" placeholder="Enter a value" data-bind="value: RHS" />
<!--/ko-->
<!--ko if: RHSControlType() == 'combo'-->
<select data-bind="options: PropertyOptions, optionsText:'displayText', optionsValue:'value', value: RHS"></select>
<!--/ko-->
我确定我在这里遗漏了一些简单的东西。我期待文本框呈现时,它应该是空的。淘汰赛如何评估计算的可观察量是否有顺序?我确实尝试在 chrome 开发工具中进行调试,并且断点按正确的顺序命中,但它没有将 RHS 设置为空。我在想可能是在 LHS 订阅功能可以将 RHS 设置为 null 之前评估 RHSControlType。
JS 小提琴:https://jsfiddle.net/vabii/t2Lszjqm/
谢谢。
【问题讨论】:
-
为什么在文本框和选择框上有相同的observable(RHS)?
-
@JonathanChaplin 如果我有另一个 RHS 变量用于选择,我必须跟踪 RHS 的真实值。我正在将此数据发送到服务器并对其进行序列化以供以后评估。
标签: knockout.js