Knockout.js Asp.net mvc4、淘汰js、淘汰ViewModel是否为所有视图加载?

Knockout.js Asp.net mvc4、淘汰js、淘汰ViewModel是否为所有视图加载?,knockout.js,asp.net-mvc-4,Knockout.js,Asp.net Mvc 4,我不熟悉asp.net mvc4和knockoutjs,需要帮助了解视图的工作方式 我在共享文件夹中有一个_Layout.vbhtml,它是项目中所有页面的母版页 我有AccountController、HomeController和GrowerController 我在视图文件夹中有GrowerController的Grower文件夹。和往常一样,索引是默认视图 在Views/Grower/Index中,我有一个Knookout ViewModel,它从服务器检索数据 现在,当我转到其他视图(

我不熟悉asp.net mvc4和knockoutjs,需要帮助了解视图的工作方式

我在共享文件夹中有一个_Layout.vbhtml,它是项目中所有页面的母版页

我有AccountController、HomeController和GrowerController

我在视图文件夹中有GrowerController的Grower文件夹。和往常一样,索引是默认视图

在Views/Grower/Index中,我有一个Knookout ViewModel,它从服务器检索数据

现在,当我转到其他视图(如Home/Index)时,我在Firebug的控制台中看到,它正在进行这些调用以从服务器获取数据,即使我不在创建knockout ViewModel的视图中

我很困惑。这是因为我对所有页面都使用了_layout.vbhtml吗?我做错了什么

编辑: *_Layout.vbhtml*

Grower/Index.vbhtml


如果没有看到您的_Layout.vbhtml,我不能肯定,但是由于您在每个页面上都运行javascript,因此您可能在_Layout.vbhtml上有您的脚本标记

因此,将其移动到Index.vbhtml中,或将其放置在标记中,请在Layout.vbhtml中使用@RenderSectionScripts,并在视图中使用:

@Section "Scripts"

@<script>
    // write JS here or reference a file using the src attribute
</script>

End Section

每当获取id=PageId的文件并将其注入DOM时,都会运行此操作。您可以在此处使用任何选择器,因此。当注入class=require-vm的页面时,可以使用require-vm触发。

您已经在布局页面中定义了淘汰视图模型

如果您打算在所有页面上使用此视图模型,这是很好的,但听起来好像您不想这样做。将其移动到“特定操作”视图中以将其隔离

在上面对Sethi的评论中,您提到当您这样做时javascripts不起作用。。。这可能是因为您在布局和视图中都放置了脚本标记。我敢打赌,您正在尝试在加载knockout.js之前构建视图模型

良好做法:

在布局中,将脚本标记放在页面底部,就在关闭标记之前。。。关闭前的最后一个标记应该是设置好的RenderSection调用

现在,您可以在视图中的任何地方定义这个脚本部分,并确保它将在您的框架脚本(例如jQuery、Knockout等)之后出现


另外,请记住,使用jQuery时,最好使用$.ready,以确保脚本仅在加载DOM后运行。

My\u layout.vbhtml有一个@RenderSectionscripts,required:=False,在关闭后但在正文内。对于javascript,我不使用index.vbhtml中的Scripts部分,因为如果我这样做,javascripts将不起作用。My knockout.js包含在_layout的标记中,应该可以用于使用_layout.vbhtml的每个页面。我正在使用$document.bind'pageinit',函数{根据jQuery移动推荐,并在其中执行ko.applyBindings。不知道这是否是问题所在,它认为pageinit是页面的全局初始化,因此ko模型正在加载所有视图?创建脚本部分并在该视图中移动jscript没有帮助。请提出建议。另外,为了澄清,淘汰视图模型是i在特定视图中,而不是在_布局中。我已经将其移动到脚本部分,javascript似乎通过在$document.bind'pageinit'函数中执行$divID.hide来打破隐藏一个div的局面{,但div显示,将js移出部分脚本是有效的。在每个Firebug的每个视图导航中,敲除viewmodel中定义的所有函数调用仍在执行。请注意,如果我将ko viewmodel移动到特定视图的脚本部分,则在刷新页面之前,它根本不会加载!不知道发生了什么。在我的原始邮件中添加了_Layout.vbhtml和Grower/Index.vbhtml标记。
    @Code
      ViewData("Title") = "Select a Grower/Branch"
    End Code

    @section scripts
      <script type="text/javascript">

      function SuperViewModel() {

        //====== GrowerInfo =======
        var self = this;
        self.GrowerName = ko.observable();
        self.GrowerCompany = ko.observable();
        self.GrowerAddress = ko.observable();
        self.ShowGrowerCompany = ko.observable();
        self.GrowerID = ko.observable();

        self.updateGrowerInfo = function () {
          $.getJSON("GetGrower", function (allData) {
          self.GrowerName(allData.Name);
          self.GrowerCompany(allData.CompanyName);
          self.GrowerAddress(allData.Address);
          self.ShowGrowerCompany(allData.ShowCompany);
          self.GrowerID(allData.ID);
         });
        };

        //Load initial state from server and populate viewmodel
        self.updateGrowerInfo();
        //========= End GrowerInfo ==========

         if ($("#hfFlag").val() == "1") {
          //========= BranchInfo ==========
          self.BranchName = ko.observable();
          self.Company = ko.observable();
          self.Address = ko.observable();
          self.ID = ko.observable();

          //Load initial state from server and populate viewmodel
          self.updateBranchInfo = function () {
           $.getJSON("GetBranch", function (allData) {
            self.BranchName(allData.Name);
            self.Company(allData.CompanyName);
            self.Address(allData.Address);
            self.ID(allData.ID);
          });
        };

        self.updateBranchInfo();
        //=========== End BranchInfo ==============
      }


      //=============== GrowerList ===============
      var MyGrower = function (data) {
       this.growerId = ko.observable(data.GrowerId);
       this.growerName = ko.observable(data.GrowerName);
     };

      self.growers = ko.observableArray([]);

      self.updateGrowers = function () {
        //refresh listview
        $("#ulGrowerList").listview();
        $("#ulGrowerList").listview("refresh");

      $.getJSON("GetGrowers", function (allData) {
        var mappedGrowers = $.map(allData, function (item) { return new MyGrower(item) });
        self.growers(mappedGrowers);


        });
      };

      self.setSelectedClassToGrowerList = function (item, event) {

        $(ulGrowerList).closest('ul').find('a').removeClass('highlight');
        $(ulGrowerList).closest('ul').find('.selected').remove();

        $(event.target).toggleClass("highlight");
        if ($(event.target).hasClass("highlight")) {
          $(event.target).append("<span class='selected'>Selected</span>");

          replaceByValue('GrowerID', event.target.id);
          postjsonToServerNow("grower");

          //update GrowerInfo 
          $.getJSON("GetGrower", function (allData) {
            self.GrowerName(allData.Name);
            self.GrowerCompany(allData.CompanyName);
            self.GrowerAddress(allData.Address);
            self.ShowGrowerCompany(allData.ShowCompany);
            self.GrowerID(allData.ID);
          });

        } else {
          $(event.target).find(".selected").remove();
        }
      };



      self.setSelectedClassToBranchList = function (item, event) {

        $(ulBranchList).closest('ul').find('a').removeClass('highlight');
        $(ulBranchList).closest('ul').find('.selected').remove();

        $(event.target).toggleClass("highlight");

        if ($(event.target).hasClass("highlight")) {
          $(event.target).append("<span class='selected'>Selected</span>");

          replaceByValue('BranchID', event.target.id);
          postjsonToServerNow("branch");
        } else {
          $(event.target).find(".selected").remove();
        }

      };



      //Load initial state from server and populate viewmodel
      self.updateGrowers();

      //============ End GrowerList =============
    }

    //============= End ViewModel Section ====================//


      $(document).bind('pageinit', function () {
        //enable ko
        ko.applyBindings(new SuperViewModel());


        $("#divBranchList").hide();

        //show hide lists
        $("#btnGrower").click(function () {
        $("#divGrowerList").show();
        $("#divBranchList").hide();
       });

       $("#btnBranch").click(function () {
         $("#divBranchList").show();
         $("#divGrowerList").hide();
       });

      });
    </script>
    End Section




    <table class="maintable" id="maintable">
      <tr>
        <td class="left">
          <div id="GrowerInfo">
            <strong>Grower</strong><br />
            <a data-role="button" data-theme="e" id="btnGrower" data-bind="click: updateGrowers">
              <h3>
               <span data-bind="text: GrowerName"></span>
              </h3>
              <span data-bind="text:GrowerCompany, visible: ShowGrowerCompany" class="block"></span><span data-bind="text: GrowerAddress">
              </span>
              <br />
              <span data-bind="text: GrowerID"></span>
            </a>
          </div>
          @If ViewData("IsDealer") Then
            @<div id="BranchInfo">
              <strong>Branch</strong> <a data-role="button" data-theme="e" id="btnBranch">
                <h3>
                  <span data-bind="text: BranchName"></span>
                </h3>
                <span data-bind="text: Company"></span>
                <br />
                <span data-bind="text: Address"></span>
                <br />
                <span data-bind="text: ID"></span></a>
            </div>
          End If
        </td>
        <td class="splitline">
        </td>
        <td class="right">
          <div class="content-right">
            <div id="divGrowerList" style="overflow: auto; height: 450px; padding: 10px;">

            <p>Total growers: <span data-bind="text: growers().length">&nbsp;</span></p>

               <ul data-inset="true" data-filter="true" data-bind="foreach: growers" data-role="listview" id="ulGrowerList">
                  <li><a data-bind="click: $parent.setSelectedClassToGrowerList, attr: {id: growerId}"><span data-bind="text: growerName, attr: {id: growerId}, click: $parent.setSelectedClassToGrowerList" /></a></li>
              </ul>

              <textarea name="growers" rows="10" data-bind="value: ko.toJSON(growers)"></textarea>

            </div>
            <div id="divBranchList">
              @If ViewData("IsDealer") Then
                @Html.Action("MyBranchList2")
              End If
            </div>
            @If ViewData("IsDealer") Then
              @<input type="hidden" id="hfFlag" value="1" />
            Else
              @<input type="hidden" id="hfFlag" value="0" />
            End If
          </div>
        </td>
      </tr>
    </table>
@Section "Scripts"

@<script>
    // write JS here or reference a file using the src attribute
</script>

End Section
$(document).on('pageinit', '#PageId', function(event) {
    /* do viewmodel stuff here */
});