Почему jQuery не превращает мой массив в строку json прежде, чем отправить к веб-методу asp.net?

Очевидно, ngModel обновляет значение представления асинхронно при изменении модели. То есть значение не изменяется до следующего цикла обнаружения изменений!

Из исходного кода ngModel :

/**
 * `ngModel` forces an additional change detection run when its inputs change:
 * E.g.:
 * ```
 * 
{{myModel.valid}}
* * ``` * I.e. `ngModel` can export itself on the element and then be used in the template. * Normally, this would result in expressions before the `input` that use the exported directive * to have and old value as they have been * dirty checked before. As this is a very common case for `ngModel`, we added this second change * detection run. * * Notes: * - this is just one extra run no matter how many `ngModel` have been changed. * - this is a general problem when using `exportAs` for directives! */ const resolvedPromise = Promise.resolve(null);

Затем при обновлении модели представление обновляется асинхронно :

private _updateValue(value: any): void {
  resolvedPromise.then(
      () => { this.control.setValue(value, {emitViewToModelChange: false}); });
}

Таким образом, setTimeout гарантирует, что вход был выбран после того, как его представление было обновлено.

Если вы хотите избежать этого асинхронного поведения, вы можете использовать FormControl вместо ngModel ( Demo StackBlitz ):

import { Component, Input, ViewChild, ElementRef } from '@angular/core';
import { FormControl } from '@angular/forms';

@Component({
  selector: 'hello',
  template: ``,
  styles: [`h1 { font-family: Lato; }`]
})
export class HelloComponent {
  private _item;

  @Input() set item(value) {
    this._item = value;
    this.count.setValue(value.count);
    this.focus();
  }

  get item() {
    return this._item;
  }

  @ViewChild('input') input: ElementRef;

  count = new FormControl();

  focus() {
    this.input.nativeElement.focus();
    this.input.nativeElement.select();
  }
}

При таком подходе вы не Мне нужно явно вызвать focus() из родительского компонента; дочерний компонент будет вызывать свой собственный метод фокусировки при каждом изменении ввода.

8
задан Herb Caudill 1 November 2008 в 16:47
поделиться

4 ответа

данные: "{'backerEntries'": + backerEntries + "}",

.. совпадает с

data: "{'backerEntries':" + backerEntries.toString() + "}",

... который в значительной степени бесполезен. Используйте предложение Duncan, если Вы просто хотите передать закодированный список значений с именем "backerEntries" в Вашем querystring. Если Вы хотите JSON-закодировать данные, затем получить библиотеку JSON и вызов JSON.stringify().

10
ответ дан 5 December 2019 в 12:14
поделиться

Данные Вы передаете Вас, пытаются уже передать его как строку. Если Вы хотите, чтобы jQuery преобразовал его, оставляют все это как объект, например.

data:{backerEntries: backerEntries }

Принятие, конечно, backerEntries является массивом. jQuery должен преобразовать это и добавит его к querystring, поскольку это - его поведение по умолчанию. Ваш текущий код полагается на поведение JavaScript по умолчанию, которое по умолчанию не преобразует массив в его строковое представление.

4
ответ дан 5 December 2019 в 12:14
поделиться

Так как Вы используете ASP.NET, можно пользоваться встроенной библиотекой сериализации Ajax ASP.NET:

var backerEntriesJson = Sys.Serialization.JavaScriptSerializer.serialize(backerEntries);

затем передача, что непосредственно в Вашем jQuery ajax вызов:

...
data: backerEntriesJson,
...
2
ответ дан 5 December 2019 в 12:14
поделиться

Это НЕ правильный JSON: {'foo': 'bar'}

Нет, никогда не было, никогда не будет. Процессоры JSON часто очень снисходительны, что, конечно, является ложным удобством.

Прочтите спецификацию. Строка должна быть заключена в двойные кавычки, а не в одинарные кавычки, не символы смайликов, не куски металла, согнутые под прямым углом, не кирпичи. Нет упоминания об одинарных кавычках, точка.

Теперь имена свойств представляют собой строки JSON. По определению они ДОЛЖНЫ быть заключены в двойные кавычки.

Допустимый: {"foo": "bar"} действительный "{" foo ": 100} действителен: {"foo": true} valid: {"foo": ["one", "two"], "bar": false}

см. www.json.org

см. www.jsonlint.com

-2
ответ дан 5 December 2019 в 12:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: