Во-первых, обратите внимание, что это исключение будет генерироваться только при запуске вашего приложения в режиме dev (что по умолчанию имеет значение по умолчанию в бета-0): Если вы вызываете enableProdMode()
при загрузке приложения он не будет сброшен ( см. обновленный plunk ).
Во-вторых, не делайте этого, потому что это исключение генерируется по уважительной причине: Короче говоря, когда в режиме dev каждый раунд обнаружения изменений сразу же сопровождается вторым раундом, который проверяет, что никакие привязки не изменились начиная с конца первого, так как это указывает на то, что изменения вызваны самим обнаружением изменения.
В вашем плунге привязка {{message}}
изменяется вашим вызовом на setMessage()
, что происходит в крюк ngAfterViewInit
, который происходит как часть начального поворота обнаружения изменений. Это само по себе не является проблематичным - проблема в том, что setMessage()
изменяет привязку, но не вызывает новый раунд обнаружения изменений, а это означает, что это изменение не будет обнаружено до тех пор, пока какой-либо другой раунд обнаружения изменений не будет запущен где-то в другом месте ,
Вынос: все, что меняет привязку, должно запускать раунд обнаружения изменений, когда это происходит.
Обновление в ответ на все запросы для примера того, как это сделать: @ Решение Tycho работает, как и три метода из , на которые указывает ответ @MarkRajcok. Но, честно говоря, все они кажутся уродливыми и неправильными для меня, такими, как хаки, которые мы привыкли опираться на ng1.
Конечно, существуют случайные обстоятельства, когда эти хаки подходят, но если вы используете их на чем-либо более, чем очень случайным образом , это признак того, что вы боретесь с каркасом, а не полностью обнимаете его реактивный характер.
ИМХО, более идиоматический подход «Угловой 2» приближается к этому, это что-то вроде: ( plunk )
@Component({
selector: 'my-app',
template: `I'm {{message | async}} `
})
export class App {
message:Subject = new BehaviorSubject('loading :(');
ngAfterViewInit() {
this.message.next('all done loading :)')
}
}
Я не знаю, лучше ли это, но легче читать:
Int32. Синтаксический анализ (sample_guid. ToString ().SubString (0,1));
Я - младший разработчик, по общему признанию, но вышеупомянутые чтения, легче мне, чем преобразование байта, и на современном компьютере, это работало бы неразличимо быстро.
Не знайте о лучшем решении, но я надеюсь, что Вы не намереваетесь использовать это Int32 в качестве случайного (или уникальный) значение.
Вы не можете зависеть ни от какой sub части Гуида, чтобы быть уникальными. Гуид, как предполагается, уникален только в целом.