我用 durandal 写 spa 网站。在我使用小部件之前,一切都很好。小部件不更新我的模型。
我的小部件视图模型:
define([], function () {
var ctor = function () {
};
ctor.prototype.activate = function (settings) {
this.settings = settings;
};
ctor.prototype.attached = function () {
$('.datepicker').datepicker({
clearBtn: true,
todayBtn: true,
});
};
return ctor;
})
我的小部件视图:
<div >
<input class="datepicker" data-bind="value: settings.datevalue"/>
</div>
然后我把我的小部件改成这个,它就可以工作了。有一个更好的方法吗?
我的小部件视图模型:
define([], function () {
var ctor = function () {
};
ctor.prototype.activate = function (settings) {
this.settings = settings;
var data = settings.data;
var property = settings.property;
this.datevalue = ko.computed({
read: function() {
return data[property];
},
write: function(value) {
data[property] = value;
}
});
};
ctor.prototype.attached = function () {
$('.datepicker').datepicker({
clearBtn: true,
todayBtn: true,
});
};
return ctor;
})
我的小部件视图:
<div >
<input class="datepicker" data-bind="value: datevalue"/>
</div>
我的视图模型:
define(['services/datacontext'],
function (datacontext) {
var myViewModel = ko.observable();
var activate = function (id) {
if (id) {
datacontext.load(id).done(function (result) {
myViewModel (result);
});
}
return {
activate: activate,
myViewModel: myViewModel
}
});
我的观点:
<section data-bind="with: myViewModel">
<address>
<label for="code">Code:</label>
<input data-bind="value: code" />
</address>
<div>
<label for="expireDate">Expire Date :</label>
<span id="expireDate" data-bind="datepicker: { data: $data, prop:'expireDate'}"/>
</div>
ko.mapping.fromJS 解决了我的问题,不需要这个改变。