gpt4 book ai didi

javascript - AngularJS-ng :model - Field is readonly when bound to $q promise?

转载 作者:可可西里 更新时间:2023-11-01 02:42:37 25 4
gpt4 key购买 nike

我试图从 AngularJs (1.0.7) 中的 promise 返回单个记录并将结果绑定(bind)到表单。表单正确绑定(bind),但输入字段是只读的 - 我无法编辑值。

如果我改为将记录包装在一个数组中并使用 ng:repeat 进行迭代,则表单会正确绑定(bind)并且我可以编辑值。

我创建了一个 plnkr 来清楚地展示这个问题:

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

您可以编辑直接绑定(bind)和列表绑定(bind)的输入字段,但是不能编辑绑定(bind)到单个 promise 的字段。

是否可以将 ng:model 直接绑定(bind)到从 promise 返回的对象,或者我是否需要使用数组来让它工作?

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>

编辑:经过一些调试后,我发现 ng:model 指令正在读取 promise 的值 ('$$v') 组件,但直接写入 promise 对象本身。

尝试编辑 promise 时,ViewModel 会不断恢复为原始值,同时将字符存储在 promise 本身上。因此,如果用户在输入字段中键入“asdf”,结果将如下所示。

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

而我们应该期待

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

我是不是做错了什么,或者这可能是 AngularJS 中的一个错误?

(为了进一步澄清,问题在于 Promise 返回的 Array 和 Object 之间的行为差​​异。直接绑定(bind)只是作为控件存在)

最佳答案

更新

这个问题似乎是 AngularJS 1.0.3 引入的: http://jsfiddle.net/sonicsage/k8W4Y/6/

如果你切换到 AngularJS 1.0.2,它会工作。

GitHub 上有一个 Unresolved 问题:https://github.com/angular/angular.js/issues/1827

Google Groups 上的原始线程.

这里还有一个关于自动展开的有趣话题: https://github.com/angular/angular.js/pull/1676


通过在 Chrome 控制台调试应用程序,可以看到 single 是一个函数(promise):

> $('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没有影响,但是有影响在属性上:

> $('body.ng-scope').data('$scope').single.name
""

您可以在此处进一步调试应用程序:http://run.plnkr.co/plunks/rDo7bFZlBq4rRH2ZNJn1/

编辑

不支持 IMO 直接绑定(bind)一个 promise 到一个字段(这有正式记录吗?),按如下方式更改代码将起作用:

// 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/

关于javascript - AngularJS-ng :model - Field is readonly when bound to $q promise?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16883239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com