使用Onsenui

时间:2016-04-04 07:51:47

标签: angularjs onsen-ui onsen-ui2

我试图在用户点击按住myNavigator.pushPage()请求的按钮时调用API端点。但是,我无法将$ http.get请求生成的$ scope数据传递给新页面。

如果我在 $ http.get 请求的.success中使用 console.log(' test'); 进行测试,我成功获得了控制台中的日志信息,但 $ scope.var ='某些'; 中保存的任何数据都不会传递到该页面!真的很困惑!

$scope.historyDetails = function(id){

    var options = {
      animation: 'slide', 
      onTransitionEnd: function() {
        $http.get('http://xxx-env.us-east-1.elasticbeanstalk.com/apiget/testresult/testId/'+id).success(function(data) {    

          $scope.testscore = 'something'; // this is not getting passed to page!            

          console.log('bahh'); // But I see this in console



        });              
      } 
    };
    myNavigator.pushPage("activity.html", options);        
}

页:

<ons-page ng-controller="HistoryController">
...

<span style="font-size:1.2em">{{testscore}} </span><span style="font-size:0.5em;color:#555"></span>

...
</ons-page>

2 个答案:

答案 0 :(得分:1)

是的,因为两个页面都有不同的控制器,导致不同的范围。无法从一个范围访问变量到另一个范围。

因此,在这种情况下,一种解决方案可以使用rootScope服务。 根作用域是角应用程序中所有作用域的父作用域。 因此,只要您在该控制器中注入$ rootScope服务,就可以从任何其他范围访问根范围的变量。

了解有关rootScope检查this链接的更多信息。

祝你好运。

更新1:

查看这些文章

http://www.dotnet-tricks.com/Tutorial/angularjs/UVDE100914-Understanding-AngularJS-$rootScope-and-$scope.html

https://toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/

答案 1 :(得分:0)

正如Yogesh所说,你没有得到你的价值观的原因是因为如果你看$scope.testscore并试图找到$scope定义的位置,你会发现它是控制器功能的一个参数(因此它仅适用于该控制器)。

但是我们可以看到控制器已附加到页面上,而您正在推送另一页。

因此,在这种情况下,您有几种选择:

  1. 使用$rootScope服务作为Yogesh建议(在这种情况下接受他的回答)。
  2. 创建您自己的服务/工厂/等,执行与$rootScope类似的操作。

    (function(){
        var historyData = {};
        myApp.factory('historyData', function() {
            return historyData;
        });
    })();
    

    从技术上讲,你可能会让它更有意义,但也许在某些角度指南中可以更好地描述这些内容。

  3. 如果您有多个组件共享相同的数据,那么您可能只需将控制器定义在更高的级别 - 例如ons-navigator - 这样它将包含所有页面。只有当您的应用程序非常小时才会这样做 - 不建议大型应用程序使用。

  4. 如果仅在activity.html中需要此数据,您可以在该页面的控制器中获取该数据。例如:

    myApp.controller('activityController', function($scope, $http) {
        $http.get(...).success(function(data) {
            $scope.data = data;
        });
    }
    

    但我想你仍然需要得到一些身份证明。无论如何,如果你在这里做请求可能会更好,现在你只需要id,而不是数据。 你可以用var指令欺骗它。如果您提供活动页面<ons-page var="myActivityPage">,则可以通过myActivityPage变量访问该页面。

    你一直在寻找的东西 - 当你做的时候

    myNavigator.pushPage("activity.html", options);        
    

    实际上,这些选项会保存在ons-page的{​​{1}}内。

    所以你可以做到

    activity.html

    在另一个控制器中,您的ID为myNavigator.pushPage("activity.html", {data: {id: 33}, animation: 'slide'});

  5. 如果你仍然坚持传递所有数据而不是id - 这是一个简单的例子。在2.0 beta的较新版本中(我认为自测试版6或7以来),所有方法myActivityPage.options.data.idpushPage等都会返回一个承诺 - 它会解析为popPage,从而使事情变得更容易。< / p>

    ons-page
  6. 旁注:您可能想关闭5天前发布的问题,因为它与此相关(我当时肯定错过了)。