2014-02-07 4 views
0

Я пытаюсь установить переменную, которая будет зависеть от двух других, но я не хочу, чтобы переменная, вычисляемая , реагировала на инициализацию одного из этих варов.Как вычислить переменные после его инициализации

var viewModel = function() { 
    var self = this; 
    self.first = ko.observable(""); 
    self.second = ko.observable(); 

    self.doSmth = function() { 
     self.second(self.second() + 1); 
    }; 

    self.init = function(o){ 
     self.second(o); 
    }; 

    self.comp = ko.computed(function(){ 
     self.first(); 
     self.second(); 
     alert(self.second()); 
    }); 
}; 
var vm = new viewModel(); 
ko.applyBindings(vm); 
vm.init(111); 

http://jsfiddle.net/TCAHS/1/

сообщение оповещения должно появиться только тогда, когда я нажимаю на кнопку и зависимой переменной значение было изменено. И никаких сообщений с 'undefined' и значением init '111'. Есть ли встроенное решение? Благодарю.

+3

Вы можете использовать опцию '{deferEvaluation: true}' для вашего вычисленного и явного вызова в 'doSmth'http: //jsfiddle.net/bWLXh/. Но ваш дизайн очень странный: вы не используете вычисленное значение в любом месте, кажется, вы только хотите воспользоваться преимуществами автоматической переоценки ... можете ли вы подробнее рассказать о своем случае использования и написать немного больше, что вы пытаетесь достичь? – nemesv

+0

Хорошее решение, но ему нужно вызывать вычисляемый метод, явно указывая его на каждое место. Я хочу этого избежать. И вы правы, мне не нужно вычислять ценность. Я просто хочу одно место в коде, где я могу обрабатывать изменения какой-либо переменной (более двух, конечно). –

+2

Если вам не нужно вычислять, то не используйте вычисляемые :) просто вручную «подписаться» на зависимые свойства, и вы можете сделать это в init: http://jsfiddle.net/v2j2k/ – nemesv

ответ

0

Я пойду с простым решением ... что установка флага проверить, является ли наблюдаемая инициализирован, что-то вроде:

var viewModel = function() { 
    var self = this; 
    self.first = ko.observable(""); 
    self.second = ko.observable(); 

    self.doSmth = function() { 
     self.second(self.second() + 1); 
    }; 

    self.init = function(o){ 
     self.second(o); 
    }; 

    var initialized = false; 

    self.comp = ko.computed(function(){ 
     self.first(); 
     self.second(); 

     if (initialized) { 
      alert(self.second()); 
     } 
     initialized = true; 
    }); 
}; 
var vm = new viewModel(); 
ko.applyBindings(vm); 
vm.init(111); 

И вот fiddle.

Смежные вопросы