2014-01-02 2 views
5

У меня есть простой класс модели с наблюдаемыми. Я просто хочу подписаться на его множества. Вот код, который у меня есть:knockout.js подписка не вызывается в первом наборе

var dto = function (data) { 
    var self = this; 
    self.Value1 = ko.observable(data.Value1); 
    self.Value1.subscribe(function(){ 
     console.log('here'); 
    }); 
}; 

console.log не дозвонились, когда Значение1 является первым множеством (т.е. ko.observable (data.Value1)

Как настроить его что функция происходит на Подписаться начальным и при его изменении.

ответ

12

Там нет реальной поддержки для запуска функции subscribe для начальных значений.

что вы можете сделать, это вызвать функцию valueHasMutated после вашего subscribe:

self.Value1.subscribe(function(){ 
    console.log('here'); 
}); 
self.Value1.valueHasMutated(); 

Или вы можете просто установить свои начальные значения после того, как вы подписались:

var dto = function (data) { 
    var self = this; 
    self.Value1 = ko.observable(); // only declare but not assign 
    self.Value1.subscribe(function(){ 
     console.log('here'); 
    }); 
    self.Value1(data.Value1); // assign initial value 
}; 
0

Я думаю subsribe function не Мента так работать. Другими словами, вы используете его, когда вы выполняете обратный вызов/логику, когда ваш объект observable изменился.

От @RP Niemeyer answer here:

Для уведомления абонентов, что они должны пересмотреть, вы можете использовать valueHasMutated() на вас наблюдаемый объект

1

Я просто пишу это для собственного использования:

koSubscribe = function(observable, callback){ 
    observable.subscribe(callback); 

    if (observable()) { 
     observable.valueHasMutated(); 
    } 
} 

Это основывается на других ответах здесь. Но исправляет проблему «что, если она еще не установлена?» Таким образом, это должно работать до тех пор, пока существует наблюдаемое.

использование: koSubscribe(value1, function() {…}); где value1 является ko.observable.

0

Чтобы немного улучшить ответ Ричард. Если это повторяющаяся ситуация, когда вы не знаете, получил ли наблюдаемое значение уже, но вы хотите позвонить абоненту, если он есть, то вы можете продлить подписку на KO с этой функцией, которая имеет ту же подпись, что и оригинал подписаться:

ko.subscribable.fn.subscribeAndCall = function(subscribingFunction, context, event) { 
    var subscribableValue = this(); 

    this.subscribe(subscribingFunction, context, event); 

    if (subscribableValue !== undefined) { 
    subscribingFunction.call(context, subscribableValue); 
    } 
}; 

Он также работает для начальных значений, которые falsy и случайно не вызвать какие-либо другие абонент наблюдаемого.

Пример использования для оригинального вопроса:

self.Value1.subscribeAndCall(function(){ 
    console.log('here'); 
}, this); 
Смежные вопросы