2015-07-23 2 views
0

ПРОБЛЕМЫ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() { } 

Я полностью исчерпал идеи на этом ...

ответ

0

Хорошо, по какой-то причине self.validator всегда был NULL. Мой guess Модуль оценивается до того, как HTML будет введен в Durandal placeholder. Поэтому, когда оценивается self.validator = $("#post-form").validate({, форма с ID #post-form не существует на странице, и поэтому self.validator не определен.

Так что мое решение было назначить только self.validator в моих init() функцию, которая вызывается во время обратного вызова attached в жизненного цикла Дюрандаль.

Смежные вопросы