2014-10-29 20 views
0

下面,彙總和測試通過MyCtrl進行設置。我看到「我的測試」正確顯示,但不顯示「summary.name」。我看到MySvc.get()的回調按預期執行,但是summary.name的更新值不會出現在UI上。爲什麼不更新模型的值,通過服務更新,在UI中更改?

爲什麼summary.name的更新值沒有出現在UI上的任何建議?

app.js:

... 
.state('tab.edit', { 
    url: '/edit', 
    views: { 
     'tab-dash': { 
      templateUrl: 'templates/MyTemplate.html', 
      controller: 'MyCtrl' 
     } 
    } 
}) 
... 

MyTemplate.html:

<label class="item item-input item-stacked-label"> 
    <span class="input-label">Name</span> 
    <textarea rows="8" placeholder="Nothing yet." ng-model="summary.name"></textarea> 
</label> 
<label class="item item-input item-stacked-label"> 
    <span class="input-label">TEST</span> 
    <textarea rows="8" placeholder="Nothing yet." ng-model="test"></textarea> 
</label> 

controllers.js:

... 
.controller('MyCtrl', function($scope, MySvc) { 

    console.log("MyCtrl: entered"); 

    $scope.summary = MySvc.get(0); 
    $scope.test = "my test"; 
... 

MySvc.get(0)返回(我看到這個回調執行並更改ret.name):

return $http.get(url).then(function(response) { 

    console.log("MySvc callback: response.data = %o", response.data); 
    console.log("MySvc callback: response.data.name = " + response.data.name); 

    ret = new MySvc(response.data); 

    console.log("MySvc callback: ret.name = " + ret.name); 

    return ret; 
}); 
+1

不能說你提供什麼問題,但這裏有一些指針。 (返回):返回$ http.get(url).then(函數(響應){' )您應該從服務中返回一個承諾並解析('.then')它在控制器並在那裏設置'$ scope.summary' 您需要提供更多的MySvc來解決當前代碼中的主要問題。 – Absor 2014-10-29 20:54:40

回答

1

您將MySvc.get的返回值視爲同步(即時可用)值。通過$ http服務收到的內容不可立即使用,因此您不能將其視爲簡單的返回值。

你真正想要做的是把它作爲一種承諾,它(最有可能)是:

MySvc.get(0) 
.then(function(summary) { 
    $scope.summary = summary; 
}); 

,你可能會希望在承諾閱讀起來,Chapters 1 to 3「你不知道JS - 異步&性能「是一個很好的起點。