Asp.net-Mvc

Sammy.js 和 Knockout.js => 沒有模板的模板?

  • December 16, 2016

我對javascript客戶端開發的概念相當陌生。我遇到了一個問題,儘管我可能只是不明白如何使用框架的混搭來完成某些事情。

我知道我想使用 Knockout 來獲得豐富的客戶端優勢。我還想使用 Sammy.js 來允許將數據路由和傳遞給淘汰視圖(我來自 MVC 背景,我用數據填充模型,然後返回視圖(模型),MVC 將它綁定得很好,對我有好處) .

所以現在我正在嘗試做一些類似的客戶端……

這是我的 Index.html :

<!DOCTYPE html>

<html>
 <head>
   <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, maximum-scale=1.0, user-scalable=no;" />
   <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>

   <title>The EClassifieds Mobile</title>



     <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.js"></script>
     <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1/jquery-ui.min.js"></script>
<!--      <script type="text/javascript" src="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.js"></script>-->
     <script type="text/javascript" charset="utf-8" src="./scripts/cordova-1.8.1.js"></script>
     <script type="text/javascript" charset="utf-8" src="./scripts/knockout.js"></script>
     <script type="text/javascript" charset="utf-8" src="./scripts/templ.js"></script>
     <script type="text/javascript" charset="utf-8" src="./scripts/sammy.js"></script>      
     <script type="text/javascript" charset="utf-8" src="./scripts/sammy.tmpl.js"></script>
     <script type="text/javascript" charset="utf-8" src="./services/RouteManager.js"></script>
     <script type="text/javascript" charset="utf-8" src="./services/ApplicationManager.js"></script>


      <link rel="stylesheet" href="./style/site.css" type="text/css" media="screen" title="no title" charset="utf-8"/>       
<!--      <link rel="stylesheet" href="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.css" />-->

 </head>
 <body>

 <div id="main">
 <h1>HELLO WORLD!</h1>
   <!--Sammy should update the content of this div dynamically, creating a SPA (single page application)-->
 </div>

 </body>
</html>

這是我的 Sammy 配置。

(function ($) {

   alert('Building Routes');
   var app = $.sammy('#main', function () {
       this.use('Tmpl', 'html'); 
       this.get('#/', function (context) {
           alert('Rendering Partial for Login page');
           context.app.swap('Loading...');
           this.render("/views/Login.html");
       });

   });

   $(function () {
       app.run('#/');
   });

})(jQuery);

這是我的 Login.html

<!--Model File Goes Here -->
   <script type="text/javascript" charset="utf-8" src="../models/Login.js"></script>

    <fieldset title="Please Login to Begin :">

           <div data-role="content" style="padding: 15px">
               <div data-role="fieldcontain">
                   <fieldset data-role="controlgroup" data-mini="true">
                       <label for="txtUsername">
                           Username
                       </label>
                       <input id="txtUsername" data-bind="value: username" placeholder="Stevie" value="" type="text" />
                   </fieldset>
               </div>
               <div data-role="fieldcontain">
                   <fieldset data-role="controlgroup" data-mini="true">
                       <label for="txtPassword">
                           Password
                       </label>
                       <input id="txtPassword" data-bind="value: password" placeholder="yep!" value="" type="password" />
                   </fieldset>
               </div>
               <a id="btnLogin" data-role="button" data-transition="fade" href="#page1" >
                   Login
               </a>
           </div>

           <div id="errorText">
               <h1></h1>            
           </div>

         <p id="deviceProperties">Loading device properties...</p>

   </fieldset>

<script type="text/javascript">
     $(document).ready(function () {
             ko.applyBindings(new LoginDataModel(0, "Stevie", "theTV", true));

         });

</script>

我還需要一些方法將數據從 sammy get 處理程序傳遞到淘汰頁面。有沒有辦法做到這一點,還是我在嘗試不可能的事情?


更新1:我真的很想能夠做類似的事情:

 var app = $.sammy('#main', function () {
           this.use('Tmpl', 'html'); 
           this.get('#/', function (context) {
               alert('Rendering Partial for Login page');
               context.app.swap('Loading...');
               var data = getLoginData();
               this.render("/views/Login.html", data);
           });

Sammy 使用其他模板框架做同樣的事情,但是,我看不到如何將 Knockout 視圖中的 $data 綁定到從 Sammy 傳遞的數據。

Knockout.js-External-Templates 外掛將幫助您實現此行為。一個好的起點將從這裡 編輯:“起點”連結現在指向惡意軟體。

甚至約翰爸爸也在這裡認可它

僅當您經常重用模板時,上述解決方案才有用。盡可能使用內聯模板。內聯模板——使用 foreach 綁定,執行速度比從單獨的 DOM 元素應用模板快 1/3,即所謂的命名模板綁定。更多資訊在這裡

不確定你是否看到了這個,但是 knockoutjs 網站上的 webmail 教程使用 sammy.js 進行路由:

http://learn.knockoutjs.com/#/?tutorial=webmail

這是成品的連結(如果您不想遵循整個教程,可以查看原始碼) http://learn.knockoutjs.com/WebmailExampleStandalone.html

引用自:https://stackoverflow.com/questions/11250958