2016-12-29 86 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页有它的定义,像这样

<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> 

它的工作视图模型时我第一次点击按钮,但不是在那之后。

在控制台上没有错误,并且似乎负载产品功能未被触发 第一次除外。

任何帮助的欢迎

回答

0

有一个很多在你的代码有问题的点

  • (过)使用全局变量;
  • 尴尬的格式(难以阅读和调试,但也很难帮助你);
  • 同步ajax调用(为什么?这很少是一个好主意,如果稍后将其更改为异步,它可能会再次破坏整个事情);
  • 覆盖可观察到的属性ID = html.ID;
  • 语法错误/问题,使用,,你打算;
  • 没有露出观测都:任何代码位应该是怎样“看” ID等,如果你不揭发他们?
  • alreadyloaded sortoff作为一个布尔值,而这是一个数字的组合(即与==,而不是比较安全===
  • 你为什么在ready回调做if...else在所有?它应该被称为一次无论如何...

修复所有这些问题,很可能你会找到你的问题的根源。

+0

可观察到的暴露,并正确绑定,并且它们与阿贾克斯更新调用结果,每次单击父页面的编辑按钮时,调用ready函数 – user2475096

+0

无论如何,我主要关心的是要知道loadproduct方法为什么只是第一次触发。谢谢 – user2475096

+0

不,它们不是,在你的文章中'''可观察的'变量在视图模型构造函数实例之外是* not * visible。 [其他答案](http://stackoverflow.com/a/41381810/419956)清楚地显示了它们之间的差异,因为*会使用'self = this'这个成语来暴露它们。 – Jeroen

0

我认为这种基因敲除和DOM操作的混合是有问题的...您可能可以在更纯的基因敲除解决方案中做到这一点。

这就是说,我认为问题是你如何修改数据...你必须通过将它们包含在圆括号中或更新视图来更新observables,虽然它将执行“一次性”绑定不可观察的数据。这也是一个很好的习惯有范围变量(如个体经营)跟踪此所以你不要在不同的情况下会有奇怪的范围的问题:

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(); 
    });