ПРОБЛЕМЫRequireJS/Дюрандальте поле всегда нулевое
Durandal или, возможно, RequireJS, кажется, делают мои свойства нуля. У моей основной модели просмотра есть 3 подкатегории (PostModel, КатегорияModel, TagModel), и все это в конечном итоге является пустым.
КОД
Главная Файл: blog.js
var viewModel;
define(['jquery', 'knockout', 'datajs', 'OData', 'Q', 'breeze', 'blog-posts', 'blog-categories', 'blog-tags'],
function ($, ko, datajs, odata, Q, breeze, posts, categories, tags) {
'use strict'
var ViewModel = function() {
var self = this;
self.postModel = false;
self.categoryModel = false;
self.tagModel = false;
self.activate = function() {
self.postModel = new posts();
self.categoryModel = new categories();
self.tagModel = new tags();
};
self.attached = function() {
breeze.config.initializeAdapterInstances({ dataService: "OData" });
self.postModel.init();
self.categoryModel.init();
self.tagModel.init();
};
self.showCategories = function() {
//.....
};
self.showPosts = function() {
//.....
};
self.showTags = function() {
//.....
};
};
viewModel = new ViewModel();
return viewModel;
});
post.js
define(['jquery', 'jqueryval', 'knockout', 'kendo', 'kendo-knockout', 'notify'],
function ($, jqueryval, ko, kendo, ko_kendo, notify) {
'use strict'
var PostModel = function() {
var self = this;
self.id = ko.observable(0);
self.categoryId = ko.observable(0);
self.headline = ko.observable(null);
self.slug = ko.observable(null);
self.teaserImageUrl = ko.observable(null);
self.shortDescription = ko.observable(null);
self.fullDescription = ko.observable(null);
self.useExternalLink = ko.observable(false);
self.externalLink = ko.observable(null);
self.metaKeywords = ko.observable(null);
self.metaDescription = ko.observable(null);
self.availableTags = ko.observableArray([]);
self.chosenTags = ko.observableArray([]);
self.init = function() {
//..... this code runs fine (initializes a Kendo Grid)
};
self.create = function() {
//.....
};
self.edit = function (id) {
//.....
};
self.remove = function (id) {
//.....
};
self.save = function() {
//.....
};
self.cancel = function() {
//.....
};
self.validator = $("#post-form").validate({
rules: {
// JQuery Validation Rules
}
});
};
return PostModel
tag.js
define(['jquery', 'jqueryval', 'knockout', 'kendo', 'kendo-knockout', 'notify'],
function ($, jqueryval, ko, kendo, ko_kendo, notify) {
'use strict'
var TagModel = function() {
var self = this;
self.id = ko.observable(0);
self.name = ko.observable(null);
self.urlSlug = ko.observable(null);
self.init = function() {
//..... this code runs fine (initializes a Kendo Grid)
};
self.create = function() {
//.....
};
self.edit = function (id) {
//.....
};
self.remove = function (id) {
//.....
};
self.save = function() {
//.....
};
self.cancel = function() {
//.....
};
self.validator = $("#tag-form").validate({
rules: {
// JQuery Validation Rules
}
});
};
return TagModel;
});
category.js
define(['jquery', 'jqueryval', 'knockout', 'kendo', 'kendo-knockout', 'notify'],
function ($, jqueryval, ko, kendo, ko_kendo, notify) {
'use strict'
var CategoryModel = function() {
var self = this;
self.id = ko.observable(0);
self.name = ko.observable(null);
self.urlSlug = ko.observable(null);
self.init = function() {
//..... this code runs fine (initializes a Kendo Grid)
};
self.create = function() {
//.....
};
self.edit = function (id) {
//.....
};
self.remove = function (id) {
//.....
};
self.save = function() {
//.....
};
self.cancel = function() {
//.....
};
self.validator = $("#category-form").validate({
rules: {
// JQuery Validation Rules
}
});
};
return CategoryModel;
});
УКАЗАНИЯ
- Каждый из
init()
функций работает отлично, так как они инициализации кендо сеток и я могу видеть, как они работают отлично. - Когда я пытаюсь позвонить
create()
на любом из них, они выбрасывают ошибки о том, что поля равны нулю. Пример:self.validator is undefined
(я вызываю сброс на валидаторе внутриcreate()
). - Итак, что я сделал, было выполнено следующее внутри FireBug:
alert(JSON.stringify(viewModel.postModel));
Это просто показывает{}
, поэтому мы можем увидеть пустой объект здесь.
ЧТО Я Пытались
- Я попытался изменить все, чтобы Синглтон, например:
var CategoryModel = {}
вместо:
var CategoryModel = function() {};
Это, казалось, помешало viewModel.postModel
, а другие - пустым, НО это вызвало другие проблемы. В основном проблемы с обзором с ключевым словом this
я не смог установить var self = this;
в любом месте - даже когда я сделал это в activate()
, он все равно не сработает - я получаю основную модель обзора или что-то еще при доступе к this
.Поэтому я думаю, что способ, которым я сейчас настроен, является самым безопасным с точки зрения охвата, но по какой-то причине эти 3 поля всегда имеют значение NULL.
Я отрывал свои волосы в течение нескольких дней на этом. Может кто-нибудь мне помочь?
EDIT
Когда я запускаю следующее в консоли:
alert(JSON.stringify(viewModel))
я получаю:
{"postModel":{},"categoryModel":{},"tagModel":{},"__moduleId__":"viewmodels/admin/blog"}
Как вы можете видеть, дочерние модели 3 являются пустыми объектами и по какой-то причине, следующей функцией ЦИИ являются, а также отсутствует:
self.showCategories = function() { }
self.showPosts = function() { }
self.showTags = function() { }
Я полностью исчерпал идеи на этом ...