Mobx observable
наблюдает только мелкие значения. Имеется в виду, скажем, у меня есть @observable claims[]
, тогда claims[0] = something
запустит обновление, но claims[0].foo = bar
не будет (документы) . Чтобы это исправить, вам нужно сделать foo
также наблюдаемым, добавив @observable foo
к объекту claim
.
Рассмотрим следующий пример. Обратите внимание на разницу между Claim1
и Claim2
. Компоненты точно такие же, но ClaimView2
обновится, а ClaimView1
- нет. Демо
import React from "react";
import { render } from "react-dom";
import { observable, action } from "mobx";
import { observer } from "mobx-react";
class Claim1 {
moveOutDate: Date;
constructor() {
this.moveOutDate = new Date();
}
}
@observer
class ClaimsView1 extends React.Component {
@observable claims: Claim1[] = [
new Claim1(),
new Claim1()
];
@action.bound
updateClaims(){
this.claims.forEach(claim => {
claim.moveOutDate = new Date();
})
}
render() {
return
{"ClaimsView1 = \n" + JSON.stringify(this.claims, null, " ")}
}
}
class Claim2 {
@observable moveOutDate: Date;
constructor() {
this.moveOutDate = new Date();
}
}
@observer
class ClaimsView2 extends React.Component {
@observable claims: Claim2[] = [
new Claim2(),
new Claim2()
];
@action.bound
updateClaims(){
this.claims.forEach(claim => {
claim.moveOutDate = new Date();
})
}
render() {
return
{"ClaimsView2 = \n" + JSON.stringify(this.claims, null, " ")}
}
}
render(
<>
>,
document.getElementById("root")
);
Вот демонстрация для решения, которое я дал в комментариях
import React from "react";
import { render } from "react-dom";
import { observable, action } from "mobx";
import { observer } from "mobx-react";
interface IClaim {
moveOutDate: Date;
}
@observer
class ClaimsView extends React.Component<{claims: IClaim[]}> {
@observable claims: IClaim[] = this.props.claims.map(claim => observable(claim))
updateClaims = () => {
this.claims.forEach(claim => {
claim.moveOutDate = new Date();
})
}
render() {
return
{"claims = \n" + JSON.stringify(this.claims, null, " ")}
}
}
render(
,
document.getElementById("root")
);
То, что он имел в виду, - то, что управление заданиями по умолчанию выключено в неинтерактивном режиме (т.е. в сценарии.)
От bash
страница справочника:
JOB CONTROL
Job control refers to the ability to selectively stop (suspend)
the execution of processes and continue (resume) their execution at a
later point.
A user typically employs this facility via an interactive interface
supplied jointly by the system’s terminal driver and bash.
и
set [--abefhkmnptuvxBCHP] [-o option] [arg ...]
...
-m Monitor mode. Job control is enabled. This option is on by
default for interactive shells on systems that support it (see
JOB CONTROL above). Background processes run in a separate
process group and a line containing their exit status is
printed upon their completion.
То, когда он сказал, "глупо", он подразумевал что не только:
ОБНОВЛЕНИЕ
В ответе на Ваш комментарий: да, никто не будет мешать Вам использовать управление заданиями в Вашем сценарии удара - нет никакого жесткого чехла для того, чтобы сильно запретить set -m
(т.е. да, управление заданиями из сценария будет работать, если Вы захотите это к.) Помнят, что в конце, особенно в сценариях, всегда существует больше чем один способ освежевать кошку, но некоторые пути являются более портативными, более надежными, сделайте более простым обработать ошибочные случаи, проанализировать вывод, и т.д.
Вы конкретные обстоятельства могут или не могут гарантировать путь, отличающийся от какой lhunath
(и другие пользователи), считают "лучшие практики".
Управление заданиями полезно только, когда Вы выполняете интерактивную оболочку, т.е. Вы знаете, что stdin и stdout подключены к оконечному устройству (/dev/pts /* на Linux). Затем имеет смысл иметь что-то на переднем плане, что-то еще на фоне, и т.д.
Сценарии, с другой стороны, не имеют такой гарантии. Скрипты могут быть сделаны исполняемым файлом и запущены без любого присоединенного терминала. Не имеет смысла иметь приоритетные или фоновые процессы в этом случае.
Можно, однако, выполнить другие команды нев интерактивном режиме на фоне (добавление "и" к командной строке) и получить их PIDs с $!
. Затем Вы используете kill
уничтожить или приостановить их (моделирование Ctrl-C или Ctrl-Z на терминале, это оболочка была интерактивной). Можно также использовать wait
(вместо fg
) ожидать фонового процесса для окончания.
Bash действительно поддерживает управление заданиями, как Вы говорите. В записи сценария оболочки часто существует предположение, что Вы не можете полагаться на то, что у Вас есть удар, но что у Вас есть ванильная Оболочка Bourne (sh
), который исторически не имел управления заданиями.
Мне трудно в эти дни воображать систему, в которой Вы честно ограничиваетесь реальной Оболочкой Bourne. Большинство систем /bin/sh
будет связан с bash
. Однако, это возможно. Одна вещь, которую можно сделать, вместо определения
#!/bin/sh
Можно сделать:
#!/bin/bash
Это и Ваша документация, прояснили бы Ваши потребности сценария bash
.
Возможно o/t, но я довольно часто использую nohup, когда ssh в сервер на продолжительном задании так, чтобы, если я выхожусь из системы, задание все еще завершилось.
Интересно, путают ли люди остановку и запуск с основной интерактивной оболочки и порождение фоновых процессов? Команда ожидания позволяет Вам порождать много вещей и затем ожидать их всех для завершения, и как я сказал, что использую nohup все время. Это более сложно, чем это и очень недогружено - sh, поддерживает этот режим также. Взгляните на руководство.
Вы также добрались
kill -STOP pid
Я довольно часто делаю это, если я хочу приостановить в настоящее время рабочий sudo, как в:
kill -STOP $$
Но горе случается с Вами, если Вы выскочили к оболочке от редактора - это будет все просто находиться там.
Я склонен использовать мнемосхему - УНИЧТОЖАЮТ и т.д., потому что существует опасность ввести
kill - 9 pid # note the space
и в былые времена Вы могли иногда снижать машину, потому что она уничтожит init!