2016-12-29 3 views
0

здесь контекст для лучшего понимания:призывающего knockoutjs ViewModel функции

У меня есть DataGrid в моей главной странице с помощью кнопки в каждой строке. когда пользователь нажимает на него загрузить другую страницу с помощью Ajax JQuery и всплывать его в загрузочном окне модальное:

<script> 
var sharedadminID = 0; 
var alreadyloaded = 0; 
... 
    function EditClick(args) { 
      var gridObj = $("#DetailsGrid").data("ejGrid"); 
      var data = gridObj.getSelectedRecords()[0].ID; 
      sharedadminID = data; 
      $("#prdmodalbody").load("pages/modals/AddEditPRD.html"); 
} 
</script> 

страница AddEditPRD.html есть это ViewModel определяется как так

<script> 

     var PRDVM = function() { 
      ID = ko.observable(); 
      DESIGNATION = ko.observable(); 
      PRIX = ko.observable(); 

      loadproduct = function() { 
       alert("innerloadproduct2222"); 
       jQuery.ajax({ 
        url: "/Admin/GetProduct?i=" + sharedadminID, 
        success: function (html) { 

         ID = html.ID, 
         DESIGNATION = html.DESIGNATION, 
         PRIX = html.PRIX      
        }, 
        async: false 
       }); 
      } 
      loadproduct(); 
     }; 

     $(document).ready(function() { 

      if (alreadyloaded == 0) { 
       VM = new PRDVM(); 
       ko.applyBindings(VM,  document.getElementById("#prdmodalbody")); 
       alreadyloaded = 1; 
      } 
      else 
       VM.loadproduct(); 
     }); 

    </script> 

это работает, когда Я нажимаю кнопку в первый раз, но не после этого.

никаких ошибок на консоли, и кажется, что функция loadproduct не запускается за исключением первого раза.

любая помощь Приветственное

ответ

0

Есть еще намного проблемных точек в вашем коде:

  • (Over) использование глобалов;
  • Неловкое форматирование (затрудняет чтение и отладку, но также трудно вам помочь);
  • Синхронный ajax звонки (почему? это очень редко хорошая идея и может снова сломать все, если вы измените его на асинхронный позже);
  • Вы заменяете наблюдаемыми свойствами с ID = html.ID;
  • Синтаксис ошибки/проблемы, используя , где вы намеревались ;
  • Не подвергая наблюдаемые на всех: как любой бит кода должен «видеть» ID и так далее, если не подвергать их?
  • Сочетание alreadyloaded sortoff служит как логическое значение, в то время как это число (то есть по сравнению с == вместо более безопасным ===)
  • Почему вы делаете if...elseна всех в ready обратного вызова? Его следует называть однажды так или иначе ...

Исправить все эти проблемы и, скорее всего, вы найдете причину своей проблемы.

+0

наблюдаемые подвергаются и правильно связаны, и они обновляются с помощью AJAX результат вызова, функция готовности вызывается каждый раз, когда я нажимаю кнопку редактирования родительской страницы – user2475096

+0

. В любом случае моя главная проблема заключается в том, чтобы знать, почему метод loadproduct запускается только в первый раз. спасибо – user2475096

+0

Нет, это не так, переменные 'наблюдаемые', такие как' ID' в вашем сообщении, * не * видны за пределами экземпляров функции конструктора модели представления. [Другой ответ] (http://stackoverflow.com/a/41381810/419956) ясно показывает разницу, поскольку это * делает * выставлять их, используя идиому 'self = this'. – Jeroen

0

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

Это говорит о том, что проблема заключается в том, как вы изменяете данные ... вы должны обновлять наблюдаемые, обертывая их в круглых скобках, или нокаут не обновляет представление, хотя он будет связывать «один раз» с не наблюдаемые данные.Это также хорошая привычка отслеживать это с контекстным переменным (как я), так что вы не может получить непредсказуемые вопросы областей видимости в различных контекстах:

var PRDVM = function() { 
     var self = this; 
     self.ID = ko.observable(); 
     self.DESIGNATION = ko.observable(); 
     self.PRIX = ko.observable(); 

     self.loadproduct = function() { 
      alert("innerloadproduct2222"); 
      jQuery.ajax({ 
       url: "/Admin/GetProduct?i=" + sharedadminID, 
       success: function (html) { 

        self.ID(html.ID); 
        self.DESIGNATION(html.DESIGNATION); 
        self.PRIX(html.PRIX);      
       }, 
       async: false 
      }); 
     } 
     self.loadproduct(); 
    }; 

    $(document).ready(function() { 

     if (alreadyloaded == 0) { 
      VM = new PRDVM(); 
      ko.applyBindings(VM,  document.getElementById("#prdmodalbody")); 
      alreadyloaded = 1; 
     } 
     else 
      VM.loadproduct(); 
    }); 
Смежные вопросы