2012-04-26 93 views
14

我正在使用Knockout.js構建客戶端視圖模型。在我的視圖模型中,我想公開一些可以綁定到頁面元素(典型的MVVM模型)的函數。我只希望這些功能以響應來自點擊一個按鈕事件中調用,但是當被構建視圖模型它們被稱作......加載時敲除JS調用函數

我定義我的模式是這樣的:

<script type="text/javascript"> 
var ViewModel = function(initialData) { 
    var self = this; 

    self.id = initialData; 
    self.isSubscribed = ko.observable(false); 
    self.name = ko.observable(); 

    self.SubscribeToCategory = function() { 
     $.ajax({ 
      url: '@Url.Action("Subscribe", "Category")', 
      type: 'POST', 
      data: { 
       categoryId: self.id 
      }, 
      success: function() { 
       self.isSubscribed(true); 
      }, 
      failure: function() { 
       self.isSubscribed(false); 
      } 
     }); 

     alert('Subscribing...'); 
    }; 

    self.UnsubscribeFromCategory = function() { 
     $.ajax({ 
      url: '@Url.Action("Unsubscribe", "Category")', 
      type: 'POST', 
      data: { 
       categoryId: self.id 
      }, 
      success: function() { 
       self.isSubscribed(false); 
      }, 
      failure: function() { 
       self.isSubscribed(true); 
      } 

     }); 

     alert('Unsubscribing...'); 
    }; 

    self.LoadCategory = function() { 
     $.ajax({ 
      url: '@Url.Action("GetCategory", "Category")', 
      type: 'POST', 
      async: true, 
      data: { 
       categoryId: self.id 
      }, 
      dataType: 'json', 
      success: function (data) { 
       self.isSubscribed(data.IsSubscribed); 
       self.name(data.Name); 
      } 
     }); 
    }; 

    self.LoadCategory(); 
}; 


$(document).ready(function() { 
    var data = '@Model'; 
    var viewModel = new ViewModel(data); 
    ko.applyBindings(viewModel); 
}); 

但是,當我執行代碼時,兩個警報會自動啓動,但我並不期待他們。我使用ASP MVC4,並且正在使用視圖模型的HTML低於:

<p> 
    ID: <span data-bind="text: id"></span> 
</p> 
<div id="subscribe" data-bind="visible: isSubscribed == false"> 
    <button data-bind="click: SubscribeToCategory()">Subscribe</button> 
</div> 
<div id="unsubscribe" data-bind="visible: isSubscribed == true"> 
    <button data-bind="click: UnsubscribeFromCategory()">Unsubscribe</button> 
</div> 
<div> 
    Category Name: <span data-bind="text: name"></span>Is Subscribed: <span data-bind="text: isSubscribed"> 
    </span> 
</div> 

我通過網上教程和其他一些淘汰賽的樣品,還有其他地方在我的代碼,我已經看過使用敲除,但我不明白爲什麼這兩個函數(SubscribeToCategory和UnsubscribeFromCategory)在文檔加載時觸發。

回答

21

jsfiddle

我花了一秒鐘,但最終是一個簡單的解決。從你的data-bind =「click:SubscribeToCategory()」中刪除(),並讓你單擊處理程序這個數據綁定=「點擊:SubscribeToCategory」和數據綁定=「點擊:UnsubscribeFromCategory」

+2

看起來你在同一時間得到了答案。謝謝! – Aidos 2012-04-26 12:16:51

+3

如果你需要一個帶參數的函數調用?像:'data-bind =「單擊:SucscribeToCategory(25)」' – Wrench 2015-01-19 19:34:46

+3

您可以使用'bind'函數來實現自己的功能。在你的示例@Wrench中,它會是這樣的:'data-bind =「單擊:SucscribeToCategory.bind($ data,25)」' – 2015-02-24 18:44:54

5

看來,綁定<button data-bind="click: SubscribeToCategory()">Subscribe</button>中的函數名稱中的括號是問題所在。 ()不應該在那裏。所以它應該看起來像:

<button data-bind="click: SubscribeToCategory">Subscribe</button> 
+1

如何傳遞參數? – Singh 2015-10-06 07:19:37