2013-06-02 1 views
10

Я пытаюсь вернуть единую запись из обещания в AngularJs (1.0.7) и привязать результат к форме. Форма правильно связывается, однако поля ввода доступны только для чтения - я не могу редактировать значения.

Если вместо этого я завершаю запись в массиве и повторяю с помощью ng: repeat, форма связывается правильно, и я могу редактировать значения.

Я создал plnkr, который демонстрирует проблему ясно:

http://embed.plnkr.co/fOWyhVUfekRbKUSRf7ut/preview

Вы можете редактировать непосредственно связанные и список связаны поля ввода, однако поле привязывается к одной обещанию не может быть изменен.

Можно ли привязать ng: model непосредственно к объекту, возвращенному из обещания, или мне нужно использовать массив, чтобы заставить это работать?

app.controller('MainCtrl', function($scope, $timeout, $q) { 

    var person = {"name": "Bill Gates"} 

    var deferList = $q.defer(); 
    var deferSingle = $q.defer(); 

    // Bind the person object directly to the scope. This is editable. 
    $scope.direct = person;  

    // Bind a promise to the scope that will return a list of people. This is editable. 
    $scope.list = deferList.promise; 

    // Bind ap romise to the scope that will return a single person record. This is *not* editable. 
    $scope.single = deferSingle.promise; 

    // Resolve the promises 
    $timeout(function(){ 
    deferList.resolve([person]); // Array 
    deferSingle.resolve(person); // Just the record itself 
    }, 100); 


}); 


<body ng-controller="MainCtrl"> 
    Directly Bound - This field is editable 
     <input ng:model="direct.name"/> 
    <hr/> 
    Singleton Promise - This field is *not* editable. 
     <input ng:model="single.name"/>  
    <hr/> 
    List Promise: - This field is editable 
     <div ng:repeat="person in list"> 
      <input ng:model="person.name"/> 
     </div> 

</body> 

Edit: После некоторой отладки, я обнаружил, что нг: директива модель чтение от значения («$$ V») компонент обетования, но писать непосредственно на обещание сам объект.

При попытке отредактировать обещание ViewModel продолжает возвращаться к исходному значению при сохранении символов в самом обещании. Таким образом, если пользователь вводит «asdf» в поле ввода, результатом будет следующее.

{Name: "Asdf", $$v: {Name: "Bill Gates"}} 

В то время как мы должны вместо этого ожидать

{$$v: {Name: "asdf"}} 

Я делаю что-то неправильно, или это потенциально ошибка в AngularJS?

(В целях дальнейшего уточнения, этот вопрос является различие в поведении между массивом и объект, возвращаемый обещание. Непосредственное связывание просто есть в качестве контроля)

+0

Я нашел эту проблему и создал запрос тянуть. https://github.com/angular/angular.js/pull/2854 –

ответ

8

ОБНОВЛЕНИЕ

Кажется, что вопрос был введен с AngularJS 1.0.3: http://jsfiddle.net/sonicsage/k8W4Y/6/

Если вы переключитесь на AngularJS 1.0.2, это сработает.

Там есть открытый вопрос на GitHub: https://github.com/angular/angular.js/issues/1827

Исходный поток на Google Groups.

Там также интересная нить про автоматическое разворачивание здесь: https://github.com/angular/angular.js/pull/1676


При отладке приложения в консоли Chrome, вы можете увидеть, что single функция (обещание):

> $('body.ng-scope').data('$scope').single 
Object {then: function, $$v: Object} 
$$v: Object 
then: function (b,g){var j=e(),h= 
__proto__: Object 

В то время как direct является объектом:

> $('body.ng-scope').data('$scope').direct 
Object {name: "Bill Gates", $$hashKey: "004"} 

Однако при нажатии клавиши на входе только для чтения оказывает влияние на promise, например, выбрав весь текст и стереть ее, хотя не имеет никакого эффекта на UI, оказывает влияние на собственность:

далее можно отладить приложение здесь: http://run.plnkr.co/plunks/rDo7bFZlBq4rRH2ZNJn1/

EDIT

ИМО непосредственно связывание обещание поле не поддерживается (это это официально задокументированы?), изменение кода как ВОЛП минимумы будут работать:

// Bind ap romise to the scope that will return a single person record. This is *not* editable. 
    deferSingle.promise.then(function(data) { 
     $scope.single = data; 
    }, function(data) { 
     // error 
    }); 

Вот plunker: http://run.plnkr.co/plunks/rDo7bFZlBq4rRH2ZNJn1/

+0

oops, я видел ваше редактирование после того, как я отправил свой ответ. Я не уверен, что это ошибка AngularJS. –

+0

Спасибо. Я не уверен на 100% в отношении поддерживающей привязки, однако он работает правильно почти во всех случаях, и в parse.js есть специальный код для обработки развертки $$ v. –

+0

Очевидно, что прямая привязка работает, однако, в частности, следует отметить, что обещание, возвращающее «Массив», работает, но обещание, возвращающее словарь, не работает. Прямое связывание просто было добавлено в качестве элемента управления. –