我想爲我的應用程序做一個基本視圖模型,但我努力訪問基本viewmodel的上下文。混亂的「這個」在揭示和durandal原型模式
這裏是我的基地視圖模型:
define(["config", 'services/logger'], function (config, logger) {
'use strict';
var
app = require('durandal/app'),
baseViewModel = function() {
this.items = ko.observableArray();
this.title = ko.observable();
this.selectedItem = ko.observable();
};
baseViewModel.prototype = (function() {
var
populateCollection = function (initialData, model) {
var self = this;
if (_.isEmpty(self.items())) {
ko.utils.arrayForEach(initialData, function (item) {
// self here works for all extending modules such as users
self.items.push(new model(item));
});
}
},
deleteItem = function (item) {
// "this" here same as prototype gives me window object :(
// so removing never happes
this.items.remove(item);
logger.log(config.messages.userMessages.confirmDeleted(item.Name()), {}, '', true);
},
confirmDelete = function (item) {
var
userMessage = config.messages.userMessages.confirmDelete(item.Type(), item.Name()),
negation = config.confirmationModalOptions.negation,
affirmation = config.confirmationModalOptions.affirmation;
app.showMessage(userMessage, 'Deleting ' + item.Type(), [affirmation, negation]).then(
function (dialogResult) {
dialogResult === affirmation ? deleteItem(item) : false;
});
};
return {
populateCollection: populateCollection,
confirmDelete: confirmDelete,
deleteItem: deleteItem
}
})();
return baseViewModel;
});
我所在的地方使用這種非工作的事情的一個例子是:
define(['services/logger', 'models/user', 'viewmodels/baseviewmodel', 'services/dataservice'], function (logger, user, baseviewmodel, dataservice) {
var
users = new baseviewmodel();
users.title('Users')
users.searchTerm = ko.observable().extend({ persist: users.title() + '-searchterm' });
users.activate = function() {
this.populateCollection(dataservice.getUsers, user.model);
}
return users;
});
項目也開始使用populateCollection
無誤。 confirmDelete
也在模板中正確綁定,這可能是由於不需要上下文 ,但deleteItem
需要上下文,因此它可以訪問items
並在其上調用remove
。
如何正確地訪問
this
爲一體的baseViewModel
這樣我就可以輕鬆地引用它在我的方法與此模式的背景下?
非常感謝
你的觀點是不是在這裏,但我希望你在這個使用類似選項4帖子:http://stackoverflow.com/a/8707661/1641941由於這隻附加一個處理程序,並根據'event.target'委託給正確的函數。不知道淘汰賽,但這與任何需要點擊的項目列表相關。最好不要在物品上附加處理程序,而是在容器上附加處理程序。 – HMR