2014-10-01 7 views
0

Я верю valueHasMutated(), когда применяется к любому наблюдаемому или наблюдаемому массиву, он будет обновлять/перепроверять, я верю. В техническом плане он уведомляет подписчиков о необходимости переоценки.valueHasMutated не работает должным образом?

ViewModel:

var testing =function(){ 
var self=this; 
self.status = ko.observable(1); 
self.mainobseravle=ko.observableArray(); 

function subtest() 
{ 
var self=this; 
self.controlenable = ko.observable(""); 

self.statuschange = ko.computed(function(){ 
//Here i have to use `self.status` how can i use it below. #1 
//if(self.status == 1 || self.status==4) 
{return true;} else {return false;} 
}); 

} 

} 

Мое мнение связывания на основе mainobservable, которые имеют объект subtest функции.

Ajax вызова

$.ajax({ 
//under success function 
var d = new subtest(); 
d.controlenable(data.status); 
self.mainobseravle.push(d); 
}); 

Просмотр структуры:

<table data-bind="foreach:mainobseravle"> 
<tr><td> <input type="text" data-bind="enable:$data.controlenable" /> </td></tr> 
</table> 
<input type="button" value="forward" data-bind="click:$root.forward"/> 

Кнопка Click:

self.forward = function(){ 
// i change the status here 
    self.status(2); 
    self.mainobseravle.valueHasMutated(); // this goes fine and my controls still enabled #2 
} 

Ну пусть м e делайте вещи более ясными, поскольку я хранил self.status() в вариальном и использовал внутри subtest функцию и сделал все, и я надеялся на чудо. valueHasMutated работает, но ничего не работает.

В качестве вопроса о выпуске я не могу использовать self.status() непосредственно внутри subtest функция. если вы попробуете, это порождает неопределенную ошибку, поэтому я использую здесь переменную и альтернативу?

Если у меня нет ничего важного, пожалуйста, предложите.

ответ

1

Вы используете var self = this;. Идея этой (часто плохо используемой) практики заключается в том, что вы сохраняете свой контекст (что указывает this), поэтому вы можете использовать его внутри функций, которые создают собственное закрытие. Это дало бы вам то, что вам нужно, однако вы допустили ошибку, чтобы переопределить self в вашей функции subtest. Попробуйте это:

var testing = function() { 
    var self = this; 
    self.status = ko.observable(1); 
    self.mainobservable = ko.observableArray(); 

    self.forward = function() { 
     self.status(2); 
    }; 

    function subtest() 
    { 
     // removed var self = this; 
     this.controlenable = ko.observable("");  
     this.statuschange = ko.computed(function() { 
      // This should now work, because 'self' points to 'testing' and not 'subtest' 
      // I also made the code a bit shorter but it does exactly the same as your original code 
      return (self.status == 1 || self.status == 4); 
     }); 
     this.pushMeToMainObservable = function() { 
      self.mainobservable.push(this); 
     }; 
    } 
} 

Ajax вызов:

$.ajax({ 
    //under success function 
    var d = new subtest(); 
    d.controlenable(data.status); 
    d.pushMeToMainObservable(); 
}); 

Я не очень понимаю ваши вопросы, но это должно помочь вам вместе совсем немного. Если исправлены проблемы с областью, и вам не нужно valueHasMutated, если все остальное работает правильно.

Для справки, ваш дизайн не соответствует действительности. Вложение subtest внутри testing, а затем нажатие экземпляра subtest в наблюдаемый массив внутри testing ... ouch ... Если бы у вас была более модульная структура, у вас было бы меньше проблем с этой областью. Я не могу вдаваться в подробности здесь, потому что вы «абстрагировали» имена ваших объектов, и я понятия не имею, что такое большая картина в том, что вы пытаетесь построить. Но теперь subtest и testing слишком крепко связаны. Их функциональность перепутана.

+0

thats один большой проницательность и дальше больше функция внутри функция плохая практика? Я верю, что я пытаюсь сделать здесь, как «нажатие экземпляра субтеста в наблюдаемый массив внутри тестирования».это фиктивное имя, но в реальной картине у меня есть много функций с соответствующими функциями (модели просмотра), которые имеют объекты, похожие на класс в контроллере, имеющие объекты модели сервера (модель сервера). onload У меня есть много вызовов ajax, где я получаю данные, и я должен строить свои данные в массиве наблюдений, который находится в основной области. –

+0

, если вы заинтересованы, вы можете проверить мою структуру excat, попробуйте это http://stackoverflow.com/questions/ 25988238/long-time-running-script-while-binding-a-view-mvc. В этом 'self.MAINDATA' находится мой массив наблюдений, о котором я говорю здесь. каждый частичный вид отличается от функции 'subtest'. Я верю, что у меня нет выбора, я должен подтолкнуть свои данные к наблюдаемому массиву, который является основной функцией. кстати, структура петли будет на 5 уровне. любое предложение принято –

+1

Я не имел в виду, что функция внутри функции плохая (это не так). Тем не менее, ваш 'subtest' имеет вычисленный, который обращается к' testing' (так что 'subtest' 'знает'' тестирование'). Но 'testing' также знает' subtest', так как он хранит 'subtest' в наблюдаемом массиве. Когда два модуля нуждаются друг в другом, что-то обычно неправильно. В этом случае 'subtest' НЕ должен знать' test', и поэтому вычисленный наблюдаемый должен быть помещен внутри 'test', а' subtest' не должен нажимать на наблюдаемый массив в 'test'. Вместо этого вы должны сделать что-то вроде 'test.pushSubTest (new subtest());' –

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