Получение значений из этой области после функции инициализации (постоянство внутри CFC) - PullRequest
0 голосов
/ 01 июля 2019

Я инициирую ХФУ, как этот.

<cfscript>
  lock scope="application" timeout="5" {
    application.mycfc = new mycfc();
  }
  writeOutput(application.mycfc.readVars());
</cfscript>

В CFC я устанавливаю некоторые свойства.

component output="false" accessors="true" {
  property name="title";
  property name="foo";

  this.title = "mycfc";

  function init() {
    this.foo = "bar";

    // I can now properly read this.title, or this.foo.
    return this;
  }

  function readVars() {
    // Here, I can read this.title, from the constructor space, but I can't 
    // read this.foo. It's just blank (because the default value of the 
    // `default` attribute of `property` is "")
  }
}

Из-за реализации (кэширование в приложении) я могу вместо этого использовать application.mycfc.foo в readVars().

Из-за названия this Google сложно узнать подробности. Я думал, что это будет стойким в течение всей жизни ХФУ, но, видимо, это не так?

Я, конечно, мог бы сделать что-то вроде

var self = application[this.title]; // or application.mycfc

Или, может быть, даже

this = application[this.title];

В функциях, где я хочу получить / установить без ввода application.mycfc каждый раз.

Просто пытаюсь убедиться, что я не делаю что-то не так, или заново изобретаю колесо.

В моей реальной реализации я извлекаю строки из базы данных, чтобы заполнить структуру.

1 Ответ

4 голосов
/ 05 июля 2019

Области применения в компонентах ColdFusion (.cfc):

  • this
    - общедоступная область, чтение / запись из любого места

  • properties
    - магическая область действия, чтение / запись только через средства доступа (также известные как методы получения / установки) из любой точки мира

  • variables
    является частной областью действия,чтение / запись только внутри вашего компонента

Все эти области могут сосуществовать, но this.x НЕ является тем же полем, что и property name="x"!

Поскольку вы используетекомпонент с accessors="true", все ваши поля property могут быть прочитаны только через getter и записаны через setter.Поэтому, если вы хотите написать свойство title, используйте setTitle("mycfc"); вместо this.title = "mycfc";.То же самое касается свойства foo.Используйте setFoo("bar"); вместо this.foo = "bar";.Если вы хотите прочитать свойства, используйте application.mycfc.getTitle() и application.mycfc.getFoo().Если вы хотите установить свойства во время выполнения, используйте application.mycfc.setTitle("something").Обратите внимание, что запись в общую область, такую ​​как application, должна происходить в cflock, чтобы избежать условий гонки (потокобезопасность).

Если вам вообще не нужны средства доступа, вы можете просто использовать publicвместо полей (accessors здесь отсутствует, т. е. установлено в false):

component output="false" {
    this.title = "mycfc";
    this.foo = "";

    function init() {
        this.foo = "bar";

        return this;
    }

    function readVars() {
        return this;
    }
}

application.mycfc = new mycfc();
writeOutput(application.mycfc.title); // mycfc
writeOutput(application.mycfc.foo); // bar

application.mycfc.title = "something";
writeOutput(application.mycfc.title); // something
writeOutput(application.mycfc.foo); // bar

Открытые поля обычно не рекомендуются, поскольку они нарушают инкапсуляцию.

...