2013-01-14 22 views
2

我有一种情况,当某个observable发生更改时,我想执行任务,因此我设置了订阅 - 但是我不希望在创建该项目时触发它。KnockoutJS - 仅在初始化后触发订阅

http://jsfiddle.net/ciel/EeZjH/

基本上,“绑定”已被设置为每个项目时,从控制器来的 - 所以我不希望发布的更改呢。只有当它们从初始化值改变时。这是否合理?

function Item(data) { 
    this.Binding = ko.observable(data); 

    this.Binding.subscribe(function (newValue) { 
    console.log("The Binding is Now " + newValue); 
    }); 
} 

var viewModel = { 
    Options: ko.observableArray([{ 
    "Value": "1", 
     "Name": "One" 
    }, { 
    "Value": "2", 
     "Name": "Two" 
    }, { 
    "Value": "3", 
     "Name": "Three" 
    }]), 
    Items: ko.observableArray([]) 
}; 

viewModel.Items.push(new Item("1")); 
viewModel.Items.push(new Item("2")); 
viewModel.Items.push(new Item("3")); 

viewModel.output = ko.computed(function() { 
    return JSON.stringify(
    viewModel.Items().map(

    function (i) { 
    return i.Binding(); 
    })); 
}); 

ko.applyBindings(viewModel); 
+2

如果我理解正确的话,你要设法避免触发势必'Binding'功能创建对象时?我只是跑了你的小提琴,那个回调实际上没有被调用。你能否进一步解释这个问题? –

+0

你的假设是正确的。小提琴似乎从昨天被打破,不知道为什么。我认为jsFiddle正在升级或什么,它是干扰。 – Ciel

+0

如果您在小提琴上检查控制台,它会抛出各种随机错误,我认为这些错误与我的代码无关。这些错误发生在我运行的每一个小工具中,不管框架是什么,所以我相当肯定它与我的代码无关。 – Ciel

回答

1
ko.observable.fn.beforeAndAfterSubscribe = function (callback, target) { 
var _oldValue; 
this.subscribe(function (oldValue) { 
    _oldValue = oldValue; 
}, null, 'beforeChange'); 
    this.subscribe(function (newValue) { 
    callback.call(target, _oldValue, newValue); 
}); 
};