myViewModel.personName.subscribe(function(newValue) {
alert("The person's new name is " + newValue);
});
这将在personName更改时发出警报。 好吧,你想知道你的模型什么时候发生变化...
var viewModel = … // define your viewModel
var changeLog = new Array();
function catchChanges(property, value){
changeLog.push({property: property, value: value});
viewModel.isDirty = true;
}
function initialiseViewModel()
{
// loop through all the properties in the model
for (var property in viewModel) {
if (viewModel.hasOwnProperty(property)) {
// if they're observable
if(viewModel[property].subscribe){
// subscribe to changes
viewModel[property].subscribe(function(value) {
catchChanges(property, value);
});
}
}
}
viewModel.isDirty = false;
}
function resetViewModel() {
changeLog = new Array();
viewModel.isDirty = false;
}
function updateEntireViewModel() {
var rawViewModel = Ajax_GetItemEntity(); //fetch the json object..
//enter validation code here, to ensure entity is correct.
if (koGlobalObserver)
koGlobalObserver.dispose(); //If already observing the older ViewModel, stop doing that!
var viewModel = ko.mapping.fromJS(rawViewModel);
koGlobalObserver = new GlobalObserver(viewModel, Ajax_Submit);
ko.applyBindings(viewModel [ ,optional dom element]);
}
var _entitiesUpdateTimers = {};
function Ajax_Submit(entity) {
var key = entity.ID; //or whatever uniquely related to the current view model..
if (typeof _entitiesUpdateTimers[key] !== 'undefined')
clearTimeout(_entitiesUpdateTimers[key]);
_entitiesUpdateTimers[key] =
setTimeout(function() { SendEntityFunction(entity); }, 500);
}
function myViewModel(){
var that = this;
that.Name = ko.observable();
that.OldState = ko.observable();
that.NewState = ko.observable();
that.dirtyCalcultions - ko.computed(function(){
// Code to execute when state of an observable changes.
});
}
that.dirtyCalculations = ko.computed(function () {
that.NewState(that);
//Compare old state to new state
if(that.OldState().Name == that.NewState().Name()){
// View model states are same.
}
else{
// View model states are different.
}
9条答案
按热度按时间cig3rfwq1#
使用扩展器:
然后道:
现在您可以这样检查:
您还可以编写一些通用的viewModel遍历,以查看是否有任何更改:
...然后在viewModel级别进行检查
ccrfmcuu2#
您可以订阅要监视的属性:
这将在personName更改时发出警报。
好吧,你想知道你的模型什么时候发生变化...
vom3gejh3#
考虑使用Knockout-Validation plug-in
它实现了以下功能:
yourProperty.isModified()-检查用户是否修改了该值。
yourProperty.originalValue -这样你就可以检查值是否真的改变了。
沿着其他验证的东西,这派上用场!
干杯
k3bvogb14#
您可以使用下面的插件:
https://github.com/ZiadJ/knockoutjs-reactor
例如,代码将允许您跟踪任何viewModel中的所有更改:
PS:到目前为止,这将不适用于嵌套在数组中的可订阅对象,但支持它的新版本正在开发中。
**更新:**示例代码已升级为可与v1.2b一起使用,v1.2b添加了对数组项与subscrible-in-subscribable属性得支持.
sf6xfgos5#
我也遇到了同样的问题,我需要观察viewModel上的任何变化,以便将数据发送回服务器,如果有人仍然感兴趣,我做了一些研究,这是我设法组装的最好的解决方案:
为了使用这个“全局观察器”:
请注意,给定的回调(在本例中为' AJAX _Submit')将在视图模型上发生任何更改时触发,因此我认为确实建议创建某种延迟机制,以便仅在用户完成编辑属性时才发送实体:
我是JavaScript和knockout框架的新手,(直到昨天我才开始使用这个奇妙的框架),所以如果我做错了什么,不要生我的气。(-:
希望这对你有帮助!
p5fdfcr16#
我修改了@绿色代码并扩展了它,这样我们就可以使用AcceptChanges,将模型标记为非脏的,并且有一个更好的方式将模型标记为可跟踪的。
http://jsfiddle.net/david_freire/3HZEu/2/
g52tjvyc7#
我通过在页面加载时获取视图模型的快照,然后将该快照与当前视图模型进行比较来实现这一点。我不关心哪些属性发生了变化,只要有变化就行。
拍摄快照:
稍后比较:
a0x5cqrl8#
请考虑如下所示的视图模型
在绑定数据之后,可以使用ko.toJS(myViewModel)函数存储状态。
您可以将视图模型中的变量声明为计算可观察值,如
当视图模型内的任何其他可观察量发生变化时,将进入该计算函数。
然后,您可以比较两个视图模型状态,如下所示:
});
注意:当视图模型初始化时,第一次也会执行此计算可观测函数。
希望这对你有帮助!干杯!!
3duebb1j9#
我喜欢Brett绿色的解决方案。正如有人指出的,isDirty比较不适用于Date对象。我通过扩展subscribe方法解决了这个问题,如下所示: