Если у вас есть source, вы увидите, что в настоящее время оно не реализовано. Интересно, что при создании экземпляра вы можете передать пользовательский код equalsFunc
, хотя он в настоящее время используется только для отслеживания зависимостей. Возможно, было сложно, так как equals
временно пропустили. На данный момент, если вы хотите добавить это самостоятельно, вы можете исправить ReactiveVar
что-то вроде:
_.defaults(ReactiveVar.prototype, {
equals: function(value) {
return _.isEqual(this.get(), value);
}
});
При этом используется подчеркивание'S isEqual, который может быть хорошим значением по умолчанию. Обратите внимание, что если equals
станет доступным в будущем, defaults предотвратит применение патча.
Я тестировал его с:
var v = new ReactiveVar();
v.set({fancy: 'pantz'});
Tracker.autorun(function() {
if (v.equals({fancy: 'pants'})) {
console.log('HORAY!');
}
});
Meteor.setTimeout((function() {
v.set({fancy: 'pants'});
}), 1000);
Обратите внимание, что в отличие от Session.equals
, зависимость будет возобновлена после любого изменения (а не только тогда, когда выполняется условие равенства выполняется).
Но ваш 'equals' метод до сих пор вызывает излишние повторы, правильно? Если 'v' получил значение' 1', а один использует 'v.equals (5)' в автозапуске, автозапуск должен возобновляться только тогда, когда 'v' изменяет его значение на' 5'. С вашим решением, он повторно запускается, как сын, как 'v' изменяется на любое другое значение, не так ли? Трудно изменить его, чтобы он работал как 'ReactiveDict' (' Session')? –
Вы правы - приведенный выше код заставит вычисление повторно запускаться после любых изменений, а не только после выполнения условия равенства. Может быть возможно оптимизировать отслеживание для скаляров, но не для объектов, без реализации «equalsFunc». Опять же, если вы только заботитесь о скалярах, вероятно, будет проще просто использовать «ReactiveDict» с постоянным ключом. –
@DavidWeldon Как определить шаблон конкретных реактивных варов? – user1952811