为什么没有更新模型的值,通过服务更新,更改UI?

时间:2014-10-29 20:27:01

标签: angularjs angular-ui-router

下面,通过MyCtrl设置摘要和测试。我看到“我的测试”显示正确,但不是“summary.name”。我看到MySvc.get()的回调按预期执行,但是在UI上没有显示summary.name的更新值。

有关为什么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 个答案:

答案 0 :(得分:1)

您将MySvc.get的返回值视为同步(立即可用)值。通过$ http服务收到的内容无法立即获得,因此您无法将其视为简单的返回值。

你真正想做的是将它作为一种承诺,它(最有可能)是:

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

你可能想要阅读承诺,Chapters 1 to 3&#34;你不知道JS - Async&amp;性能&#34;是一个很好的起点。