2016-09-01 25 views
1

我正在使用angular 1.4.12,并且我需要我的应用程序中的选择菜单。 我使用ng-options与从异步函数填充的对象数组,但SELECT没有看到更新,之后仍然是空的。我试着用“追踪”,但它不起作用。 有什么建议吗?谢谢!当ng选项模型更新时,ng ng选项不会更新选择列表

+0

你可能不得不分享一些代码。如果你可以在jsFiddle中复制这个问题,那么这将更好 –

+0

http://jsfiddle.net/halirgb/Lvc0u55v/有jsFiddle,问题是只有当ng-options数组在开始时为空 –

+0

你确定那是正确的小提琴?它没有任何使用ng-option –

回答

0

一对夫妇的问题在这里

首先,在NG选项的选择是有点复杂得多,一个简单的绑定。

其次,尝试避免在使用angular进行开发时使用setTimeout。由于称为摘要循环的过程,角绑定知道要更新。在此过程中,会评估绑定并检查更改。这个过程由角度内部触发,并且发生了很多。

然而问题在于setTimeout,因为它不是角度的一部分,不会触发摘要。所以你的选项框上的绑定永远不会更新。为了解决这个问题,angular提供了自己的超时助手。 $超时。

请参阅更新的fiddle以获得工作解决方案。

ng选项需要更新到这样的东西。你可以阅读更多关于NG选项here

<select ng-options="item.subItem.label for item in items" ng-model="model"> 
</select> 

和你的控制器需要注入$超时以上

function MyCtrl($scope, $timeout) { 
    $scope.name = 'Try'; 
    $scope.items = []; 
    $scope.model = {}; 

    $timeout(function() { 
     $scope.items = [ 
     {subItem: {value: "a", label: "1"}}, 
     {subItem: {value: "b", label: "2"}}, 
     ]; 
     alert($scope.items.length); 
    }, 2000); 
} 

UPDATE提到的原因: 由于在下面的评论中提到,使用外部库它自己的异步操作可能会导致附带的角度摘要问题。一个简单的解决方案是使用angulars诺言库$ q。我已经更新了提琴手以包含这个例子。 Click here to see it

更新的代码如下

function MyCtrl($scope, $q, $timeout) { 
    $scope.name = 'Try'; 
    $scope.items = []; 
    $scope.model = {}; 

    function myPromise(){ 
     var deferred = $q.defer(); 

     //Do your pouchDB request here and then call resolve in the pouchDB callback 
     $timeout(() => { 
      deferred.resolve("This would be your results object"); 
     }, 2000) 

     return deferred.promise;  
    } 

    myPromise().then((results) => { 
      $scope.items = [ 
      {subItem: {value: "a", label: "1"}}, 
      {subItem: {value: "b", label: "2"}}, 
     ]; 
     alert(results); 
    }); 
} 
+0

我不使用setTimeout在我的代码中,我使用PouchDB,但在ng对象中需要的数据以异步的方式回溯,所以我在小提琴中使用了setTimeout。在PouchDB查询之后,我试图在回调Pouch承诺时调用$ rootScope。$ apply(),但它不起作用 –

+0

请参阅上面的编辑。基本上使用承诺应该能够帮助你 –

+0

谢谢,我现在试试 –