Ручное построение цепочки с помощью dojo: проблема аргумента - PullRequest
1 голос
/ 23 марта 2012

Я пытаюсь создать класс, наследующий один класс.

В этом классе я хочу создать 2 объекта, которые будут переданы в конструктор родительского класса.

Чтобы сделать это, я должен использовать построение цепочек вручную и вызвать 'унаследованный' (см. http://dojotoolkit.org/reference-guide/1.7/dojo/declare.html#manual-constructor-chaining)

Моя проблема в том, что я не могу правильно передать параметры унаследованному методу. Когда я использую следующий код:

   define([ "dojo/_base/declare", "dojo/store/JsonRest", "dojo/store/Memory", "dojo/store/Cache", "dojo/store/Observable"],

   function(declare, JsonRest, Memory, Cache, Observable)
   {
      var userStore;
      return declare("app.UserStore", [Cache],
         {
            "-chains-":
            {
               constructor: "manual"
            },
            constructor: function()
            {
               this.masterStore = new JsonRest({
                  target: "/User/json",
                  idProperty: "name"
               });

               this.cacheStore = new Memory({ idProperty: "name" });

               this.inherited([this.masterStore, this.cacheStore]);
            }
         });
   });

Я получаю неопределенный аргумент arg.callee в Declare.js.

Когда я передаю аргументы в качестве параметра для унаследованного, определяется вызываемый объект. Можно ли динамически добавлять больше аргументов к объекту аргументов?

Если нет, то как мне вызвать родителя с динамически созданными объектами в этом конструкторе?

Спасибо!

Ответы [ 2 ]

5 голосов
/ 24 марта 2012

первый аргумент this.inherited всегда должен быть буквально arguments. это так, что dojo.declare может определить метод суперкласса на основе arguments.callee. учитывая, что это так, если вы хотите отправить разные аргументы методу суперкласса, тогда у вас должен быть массив в качестве 2-го аргумента для this.inherited. я не подтвердил, что это работает для конструкторов, но я бы попробовал следующее:

this.inherited(arguments, [this.masterStore, this.cacheStore]);

Мне любопытно узнать, работает ли оно.

0 голосов
/ 06 октября 2017

Последние версии Dojo [1] позволяют передавать ссылку на текущую выполняемую функцию в качестве первого аргумента this.inherited, чтобы разрешить ее использование в строгом режиме.

Как побочный эффект, второй аргумент действительно может быть массивом (даже из нестрогого кода):

constructor: function fn() {
    //...

    this.inherited(fn, [this.masterStore, this.cacheStore]);
}

[1] 1.12 или позже, если я не ошибаюсь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...