Знание того, где наблюдаемое живет в корневой модели в привязках 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
Так что не стесняйтесь посмотреть, как это делается, и если есть лучшее решение, пожалуйста, дайте мне знать:)