2013-02-15 47 views
1

這是唯一的官方文檔我能找到ko.applyBindings():沒有任何參數調用ko.applyBindings是否安全?

http://knockoutjs.com/documentation/observables.html

這不是一個真正的正式書面文件,說什麼是可選的/ etc。在測試中,似乎調用ko.applyBindings()允許在全局範圍上進行綁定,並且它看起來工作正常。有沒有人研究了源代碼(或者知道更多關於KO的知識),知道這是否安全?任何性能問題?

這是我的「應用程序」對象的一個​​SPA我的工作開始:

var app = { 

self: this, 
datacontext: new DataContext(), 
dataservice: new DataService(), 
viewModels: { 
    main: new MainViewModel(), 
    folderDetails: new FolderDetailsViewModel() 
}, 

init: function() { 

    ko.applyBindings(); 

    Sammy(function() { 

     this.get('#:folder', function() { 
      self.doFolderRoute(this.params.folder); 
     }); 

     // Override this function so that Sammy doesn't mess with forms 
     this._checkFormSubmission = function(form) { 
      return (false); 
     }; 

    }).run(); 

}, 

doFolderRoute: function(id) { 
    console.log("doFolderRoute: " + id); 
} 
} 

我能做ko.applyBindings(self.viewModels),來限制數據綁定到模型...但我有點像能夠綁定任何東西的自由,不介意(甚至像)在我的代碼中輸入app.viewModels.main,而只是「主」。

回答

2

通過使用ko.applyBindings(),Knockout不會了解您的視圖模型。 $root將不會被設置,也不會在根級別設置$data。顯然,你可以簡單地不引用這些變量。事件綁定也通過$data事件處理函數,在這種情況下將爲undefined

+0

謝謝,這聽起來像它可以打破的東西..如果不是現在,在未來的版本至少。我只注意到即使我傳入視圖模型,我仍然可以引用像「應用程序」這樣的全局項目,所以我會繼續並傳遞一個模型,以便至少能夠「正常」。如果我不想使用app.viewModels,還可以節省一些輸入。到處。 – eselk 2013-02-15 22:03:59

+1

對於沒有模型的'applyBindings',有一個有效的用例 - 當頁面上的組件沒有模型運行時,您仍然需要調用它。我只是調用'ko.applyBindings({});'這個技巧。 – Quango 2016-09-22 09:06:58

+0

另一個可能有效的情況ko.applyBindings(數據),也沒有類似於上述@Quango類似簡單結構的模型。例如:http://jsfiddle.net/rniemeyer/KcghG/(來自@rneimeyer) – 2017-10-29 15:41:21

0

僅供參考 - 這是我更新的應用程式(在進行的工作明顯):

我想通了自己:這個我曾在原代碼指向窗口,所以很明顯,這是一個壞主意,一個當我嘗試ko.applyBindings(self.viewModels)時,我得到了奇怪的結果。

var app = { 

datacontext: new DataContext(), 
dataservice: new DataService(), 
viewModels: { 
    main: new MainViewModel(), 
    folderDetails: new FolderDetailsViewModel() 
}, 

init: function() { 

    ko.applyBindings(app.viewModels); 

    Sammy(function() { 

     this.get('#:folder', function() { 
      self.doFolderRoute(this.params.folder); 
     }); 

     // Override this function so that Sammy doesn't mess with forms 
     this._checkFormSubmission = function(form) { 
      return (false); 
     }; 

    }).run(); 

    widgetLib.init(); 

}, 

doFolderRoute: function(id) { 
    console.log("doFolderRoute: " + id); 
} 
} 
相關問題