在 knockout.js 中,我有一个非常标准的字段,如下所示:
<label data-bind="text: JobTitle"></label>
如果文本值为空,我想要在此处指定默认值,例如“未指定职位”。
这可以在 knockout.js 中执行吗?
谢谢。
在 knockout.js 中,我有一个非常标准的字段,如下所示:
<label data-bind="text: JobTitle"></label>
如果文本值为空,我想要在此处指定默认值,例如“未指定职位”。
这可以在 knockout.js 中执行吗?
谢谢。
最短/最简单的方法可能是:
<label data-bind="text: JobTitle()||'No Job Title Specified'"></label>
工作示例:
var ViewModel = function() {
this.jobTitle = ko.observable();
};
ko.applyBindings(new ViewModel());
body { font-family: arial; font-size: 14px; }
.liveExample { padding: 1em; background-color: #EEEEDD; border: 1px solid #CCC; max-width: 655px; }
.liveExample input { font-family: Arial; }
.liveExample b { font-weight: bold; }
.liveExample p { margin-top: 0.9em; margin-bottom: 0.9em; }
.liveExample select[multiple] { width: 100%; height: 8em; }
.liveExample h2 { margin-top: 0.4em; font-weight: bold; font-size: 1.2em; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<div class='liveExample'>
<p>Job Title: <input data-bind='value: jobTitle' /></p>
<h2 data-bind="text: jobTitle()||'No Job Title Specified'"></h2>
</div>
或 JS 小提琴:http: //jsfiddle.net/735qC/43/
所以我猜你想要一个真正的默认值,而不仅仅是一个占位符文本。这是一种使用扩展器的方法;
ko.extenders.defaultIfNull = function(target, defaultValue) {
var result = ko.computed({
read: target,
write: function(newValue) {
if (!newValue) {
target(defaultValue);
} else {
target(newValue);
}
}
});
result(target());
return result;
};
var viewModel = function() {
this.someValue = ko.observable().extend({ defaultIfNull: "some default" });
};
ko.applyBindings(new viewModel());
http://jsfiddle.net/madcapnmckay/aTMpp/
希望这可以帮助。
甚至比其他代码示例更短的是:
ko.extenders.withDefault = function(target, defaultValue) {
target.subscribe(function(input) {
if(!input) target(defaultValue)
});
return target
};
随着启蒙
ko.observable().extend({ withDefault: "some Default" })
You can do it like this:
<label data-bind="text: JobTitle() != undefined && JobTitle() != null ? JobTitle() : 'No Job Title Specified'"></label>
With the undefined control, you can check whether you have that function or not when you are loading the page for the first time.
将默认值仅用于显示目的可能很有用,而不是应用始终返回默认值的扩展程序。
这样,模型的属性保持为空,例如在验证(检查空属性)或将数据发送回服务器(您可能不想发回此默认值)时更好。
您可以在以下示例中使用自定义绑定,它基于文本绑定,呈现提供的默认文本或-
如果未提供(当然,您可以根据需要进行调整):
ko.bindingHandlers['textWithDefault'] = {
'init': function() {
return { 'controlsDescendantBindings': true };
},
'update': function (element, valueAccessor) {
var value, defaultValue;
var options = ko.utils.unwrapObservable(valueAccessor());
if (options !== null && typeof options == "object") {
value = ko.unwrap(options['text']);
defaultValue = ko.unwrap(options['default']);
} else {
value = options;
}
defaultValue = defaultValue || '-';
ko.utils.setTextContent(element, value || defaultValue);
}
};
function ExampleModel() {
this.value = 'Sample text';
this.observableValue = ko.observable('More sample text');
this.emptyValue = '';
this.emptyObservableValue = ko.observable();
};
ko.applyBindings(new ExampleModel());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.3.0/knockout-min.js"></script>
<div data-bind="textWithDefault: value"></div>
<div data-bind="textWithDefault: observableValue"></div>
<div data-bind="textWithDefault: emptyValue"></div>
<div data-bind="textWithDefault: emptyObservableValue"></div>
<div data-bind="textWithDefault: { text: emptyValue, default: 'Custom empty value' }"></div>
<div data-bind="textWithDefault: { text: emptyObservableValue, default: 'Another custom empty value' }"></div>
我在返回表的数据时遇到了这个问题,但只有一些列是可排序的。
<tr data-bind="foreach: ArrAsrColumnHeaders">
<th class="sortable koJson" data-bind="
css: {active: ((typeof(isActive) != 'undefined') ? isActive : '')}
, text: text
, attr:{href: ((typeof(jsonClick) != 'undefined') ? jsonClick : '')}">
</th>
</tr>
这表示,对于表标题中的每一列,如果定义了“isActive”并将其设置为 true,则添加类“活动”,但如果它不存在,请不要惊慌。添加“href”属性也是如此。
免责声明:我不太了解淘汰赛,无法知道这种方法的局限性,但这对我来说很有效,而更直接的方法是 css: {active: isActive() || ''}
抛出错误。
要在输入字段中显示数据,最简单的方法是...
<input title="Stage" value="Default Entry Goes Here" readonly="readonly" type="text" id="stage" class="form-control" data-bind="value: model.stage ||text-input: Default Entry Goes Here">
它出错但有效.. :)