淘汰赛2.2.0,在更改之前订阅获取值和新值 [英] Knockout-2.2.0, subscribe get value before change AND new value

查看:73
本文介绍了淘汰赛2.2.0,在更改之前订阅获取值和新值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

jsfiddle链接: http://jsfiddle.net/T8ee7/

当我调用Knockout的subscription方法时,是否可以同时获取以前的值和新的值?现在,我只能单独调用get这些值. 如果新旧值不同,我想触发一些代码.

我想我可以做以下事情,但是会变得凌乱... ( http://jsfiddle.net/MV3fN/)

var sv = sv || {};
sv.PagedRequest = function (pageNumber, pageSize) {
    this.pageNumber = ko.observable(pageNumber || 1);
    this.numberOfPages = ko.observable(1);
    this.pageSize = ko.observable(pageSize || sv.DefaultPageSize);
};


var _pagedRequest = new sv.PagedRequest();
var oldValue;
_pagedRequest.pageNumber.subscribe(function (previousValue) {
    console.log("old: " + previousValue);
    oldValue = previousValue;
}, _pagedRequest, "beforeChange");


_pagedRequest.pageNumber.subscribe(function (newValue) {

    console.log("new: " + newValue);
    if (oldValue != newValue) {
        console.log("value changed!");
    }

});

_pagedRequest.pageNumber(10);
_pagedRequest.pageNumber(20);
​

解决方案

我更喜欢使用可观察的扩展剂.

http://jsfiddle.net/neonms92/xybGG/

扩展程序:

ko.extenders.withPrevious = function (target) {
    // Define new properties for previous value and whether it's changed
    target.previous = ko.observable();
    target.changed = ko.computed(function () { return target() !== target.previous(); });

    // Subscribe to observable to update previous, before change.
    target.subscribe(function (v) {
        target.previous(v);
    }, null, 'beforeChange');

    // Return modified observable
    return target;
}

用法示例:

// Define observable using 'withPrevious' extension
self.hours = ko.observable().extend({ withPrevious: 1 });

// Subscribe to observable like normal
self.hours.subscribe(function () {
    if (!self.hours.changed()) return; // Cancel if value hasn't changed
    print('Hours changed from ' + self.hours.previous() + ' to ' + self.hours());
});

jsfiddle link: http://jsfiddle.net/T8ee7/

When I call Knockout's subscribe method is there a way I can get both the previous and new value? Right now, I can only call get these values separately. I want to trigger some code if the old and new value are different.

I suppose I could do the following, but it can get messy... (http://jsfiddle.net/MV3fN/)

var sv = sv || {};
sv.PagedRequest = function (pageNumber, pageSize) {
    this.pageNumber = ko.observable(pageNumber || 1);
    this.numberOfPages = ko.observable(1);
    this.pageSize = ko.observable(pageSize || sv.DefaultPageSize);
};


var _pagedRequest = new sv.PagedRequest();
var oldValue;
_pagedRequest.pageNumber.subscribe(function (previousValue) {
    console.log("old: " + previousValue);
    oldValue = previousValue;
}, _pagedRequest, "beforeChange");


_pagedRequest.pageNumber.subscribe(function (newValue) {

    console.log("new: " + newValue);
    if (oldValue != newValue) {
        console.log("value changed!");
    }

});

_pagedRequest.pageNumber(10);
_pagedRequest.pageNumber(20);
​

解决方案

I prefer using an observable extender.

http://jsfiddle.net/neonms92/xybGG/

Extender:

ko.extenders.withPrevious = function (target) {
    // Define new properties for previous value and whether it's changed
    target.previous = ko.observable();
    target.changed = ko.computed(function () { return target() !== target.previous(); });

    // Subscribe to observable to update previous, before change.
    target.subscribe(function (v) {
        target.previous(v);
    }, null, 'beforeChange');

    // Return modified observable
    return target;
}

Example Usage:

// Define observable using 'withPrevious' extension
self.hours = ko.observable().extend({ withPrevious: 1 });

// Subscribe to observable like normal
self.hours.subscribe(function () {
    if (!self.hours.changed()) return; // Cancel if value hasn't changed
    print('Hours changed from ' + self.hours.previous() + ' to ' + self.hours());
});

这篇关于淘汰赛2.2.0,在更改之前订阅获取值和新值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆