我正在尝试为我的viewModel创建一个通用Container,因此可以在没有viewModel特定知识的情况下将常用方法应用于各种对象。容器和包含的对象如下所示:
var containedViewModel = function() {
var self = this;
self.id = ko.observable();
...
self.doSomething = function() {
alert('here');
};
}
var ContainerModel = function(cRoot, cModel, cName) {
var self = this;
self.rootModel = cRoot; // Root view model
self.viewName = cName; // viewModel container name
self.refModel = cModel; // viewModel reference
self.viewModel = ko.observable(); // Single view model
self.viewModels = ko.observableArray(); // Array of view models
self.init = function(rootModel) {
self.viewModel = new self.refModel();
}
self.doSomething = function() {
self.rootModel.doSomeThing(); // This works
self.refModel.doSomeThing(); // This does not work
self.viewModel.doSomeThing(); // This does not work as well
}
}
将使用以下调用创建容器:
var ParnentModel = function() {
var self = this;
self.id = ko.observable();
...
self.container = new ContainerModel(self, containedViewModel, 'modelName');
...
self.doSomething = function() {
alert('here');
};
};
在此示例中,rootModel函数访问正常,因为创建了实际的viewmodel并将其传递给容器。使用'new self.refModel()'和'self.rootModel.doSomeThing()'似乎按预期工作。当我尝试使用'self.viewModel.doSomeThing();'淘汰赛抱怨说这不是一个功能。
是否可以通过引用viewModel来访问viewModels函数。
任何帮助将不胜感激。
答案 0 :(得分:1)
你快到了。请参阅我在代码中的评论。
var containedViewModel = function() {
var self = this;
self.id = ko.observable();
self.doSomething = function() {
alert('contained');
};
// I would prefer to have return self here
};
var ContainerModel = function(cRoot, cModel, cName) {
var self = this;
self.rootModel = cRoot; // Root view model
self.viewName = cName; // viewModel container name
self.refModel = cModel; // viewModel reference
self.viewModel = ko.observable(); // Single view model
self.viewModels = ko.observableArray(); // Array of view models
self.init = function(rootModel) {
// you meant this, right?
self.viewModel(new self.refModel());
};
self.doSomething = function() {
self.rootModel.doSomething(); // This works
//self.refModel.doSomeThing(); // This does not work
// need to unwrap the value, fixed typo
self.viewModel().doSomething(); // This does not work as well
};
};
var ParnentModel = function() {
var self = this;
self.id = ko.observable();
self.container = new ContainerModel(self, containedViewModel, 'modelName');
// missing call to init
self.container.init();
self.doSomething = function() {
alert('parent');
};
};
// execution
var p = new ParnentModel();
p.container.doSomething();
答案 1 :(得分:0)
我认为你应该在传递给ContainerModel时创建包含模型的实例:
self.container = new ContainerModel(self, new containedViewModel, 'modelName');