Знание того, где наблюдаемое живет в корневой модели в привязках foreach/ потомок в нокауте

Это действительно нишевый сценарий, где в идеале мне нужно иметь возможность привязки к свойству, но при этом я должен знать, где это свойство находится в модели корневого представления.

Например, скажем, у меня есть объект:

{
   id: ko.observable(1),
   name: ko.observable("some user"),
   groups: [
      { id: ko.observable(1), name: ko.observable("some group") },
      { id: ko.observable(2), name: ko.observable("some group") },
   ]
}

Теперь проблема в том, если бы у меня были такие привязки:

<div>
<!-- ko foreach: groups -->
    <input data-bind="value: name, custom-binding: { property: name, other: foo }" />
<!-- /ko -->
</div>

Теперь я должен быть в состоянии решить name здесь, чтобы rootModel.groups[currentIndex].name в отличие от просто name, В настоящее время я не думаю, что есть способ узнать в привязке, что свойство "name" поскольку он просто видит значение, мне может потребоваться передать его в виде строки или иметь собственный атрибут объекта, который ищет привязка. В любом случае мне нужно каким-то образом получить путь к свойству для каждой наблюдаемой (связанной с rootModel, применяемой в его области действия) в рамках привязки.

Я знаю, это кажется сумасшедшим, и это так, но мне все еще нужно что-то делать, если это вообще возможно. Таким образом, foreach - это всего лишь один сценарий, в котором дочерняя область привязки изменяется и переносится, поэтому для всех сценариев мне нужно иметь возможность создать property-path для свойств, которые используются с этой пользовательской привязкой.

Так есть ли способ сделать это?

1 ответ

Решение

Казалось, не было простого способа сделать это, поэтому мне пришлось написать препроцессоры для определенных привязок, чтобы кэшировать область, а затем применить это как новое связывание во время выполнения (поскольку препроцессоры не могут получить доступ к контексту привязки).

Затем в реальных привязках они проксируются и ищут, если есть какой-либо родитель с существующей областью, тогда локальное свойство добавляется и кэшируется для дочерних поисков в контексте привязки.

Это используется в:

https://github.com/grofit/treacherous

Так что не стесняйтесь посмотреть, как это делается, и если есть лучшее решение, пожалуйста, дайте мне знать:)

Другие вопросы по тегам