订阅者在Knockout.js中通知的顺序

订阅者在Knockout.js中通知的顺序,knockout.js,knockout-3.0,Knockout.js,Knockout 3.0,我有一张有行的桌子。 每次单击一行时,viewmodel都会使用订阅服务器将其通知给其他viewmodels 同时,我在每一行上都有图标。每当我点击一个图标,我都会点击绑定到我的一个viewmodels中的一个函数 现在,当我试图从click bind函数中的行中获取任何值时,问题就出现了 订阅的触发时间似乎晚于单击功能。因此,当我使用click函数时,我还不能访问行中的数据 我通过直接在click函数中填充行数据来解决这个问题。但是我希望能够从行外部访问click函数,比如说,在DOM中的固定

我有一张有行的桌子。 每次单击一行时,viewmodel都会使用订阅服务器将其通知给其他viewmodels

同时,我在每一行上都有图标。每当我点击一个图标,我都会点击绑定到我的一个viewmodels中的一个函数

现在,当我试图从click bind函数中的行中获取任何值时,问题就出现了

订阅的触发时间似乎晚于单击功能。因此,当我使用click函数时,我还不能访问行中的数据

我通过直接在click函数中填充行数据来解决这个问题。但是我希望能够从行外部访问click函数,比如说,在DOM中的固定或绝对元素中,因此我将无法从其click绑定传递行数据。这就是为什么我使用的订阅服务器在行选择时被触发

我的问题是。我们如何知道订户何时会被解雇? 有没有办法改变订单

self.sendDataAndClick = function(data){
    self.setData(data);

    self.showAddModal();
};

//gets the info from the orders vm
shouter.subscribe(function(data) {
    self.setData(data);
}, this, "selectedOrder");

//sets the data for the viewmodel
self.setData = function(data){
    self.equipmentNumber(data.equipment_id());
    self.leg(data);
    self.setSeals(data);
}

好的,我来试试。它可能无法完全回答您的问题,但它演示了如何控制订阅的执行顺序

ko.extenders.queueSubs = function(target, value) {
    var sQueue = []; // subscription queue
    // set up a normal subscription and execute the queue subscriptions in order.
    target.subscribe(function(newValue) {
        sQueue.forEach(function(item, i) {
           sQueue[i](newValue);
        });
    });
    // overwrite the subscribe function of this observable into
    // a function that adds the subscription at a position in the queue
    target.subscribe = function(pos, fn) {
        sQueue.splice(pos, 0, fn);
    };
};
// use: ko.observable().extend({ queueSubs: true });
// queue a sub: ko.observable().subscribe(0, function(value) { alert(value); });

请参见此处的示例:

我以前在类似的情况下使用过,以确保在完成所有其他更新后运行给定的订阅-可能也适用于您。我想您正在查看正在处理的图标单击,然后它会冒泡到行单击。在任何情况下,James的setTimeout建议都是可行的。您可以使用ko扩展器,将其附加到shouter,覆盖notifySubscribers方法,在通知完成后执行回调。