2

好的..我试过 angular.js。太棒了。我印象深刻。我可以得到绑定和东西..酷。现在,如果我需要从 $scope 之外访问我的数据怎么办?假设我有一个 signalR 集线器,它发送一些数据和拦截该数据的函数,应该添加一个新项目或修改现有项目。我怎么做?你能告诉我这个例子如何$scope.twitterResultclick句柄访问吗?

<script>
    angular.module('Twitter', ['ngResource'])

    function TwitterCtrl($scope, $resource){
        $scope.twitter = $resource('http://search.twitter.com/:action',
        {action: 'search.json', q: 'obama', callback:'JSON_CALLBACK'},
        {get:{method:'JSONP'}});
        $scope.doSearch = function(){
        $scope.twitterResult = $scope.twitter.get();
      }
    }

    $(function(){
      $('#addItem').click(function(){
           // add a row to $scope.twitterResult
      });
   });
</script>

<body>
   <div data-loading></div>
    <div ng-controller='TwitterCtrl' ng-init="doSearch()">
        <ul>
           <li ng-repeat='tweet in twitterResult.results'><p> {{tweet.text}}</p></li>
         </ul>
    </div>
</body>
4

3 回答 3

2

更好的方法是将您的“信号集线器”包装在 AngularJS 服务中。看看我关于在 AngularJS 中使用 Web 套接字的博文,特别是“与 Socket.IO 交互”。

你为什么写:

$(function(){
  $('#addItem').click(function(){
       // add a row to $scope.twitterResult
  });
});

而不仅仅是使用ng-click? 这是一些第 3 方代码或小部件吗?在此之前,我会尽力为您提供更好的建议并编写一些示例代码。

如果你必须注册一个事件处理程序,你应该通过一个指令来注册。否则,当您开始管理这些外部事件绑定的生命周期时,事情会变得复杂。

于 2012-11-08T05:57:20.677 回答
1

一般的答案是:你不只是从外面弄乱范围。

但是您的要求是真实的。

所以为了做你想做的事,你需要在范围外和范围本身之间建立通信。

最简单的方法是将 $scope 导出到窗口并对其进行处理,从外部侵入范围。你永远不应该这样做。有龙。

范围应保持其内部状态。

我不完全熟悉,angular但你可以做一些事情:

function TwitterCtrl($scope, $resource) {
    // ...

    $('body').bind('newTweetsArrived', data) {
         // data contains the new tweets

         // the decision to accept or not new tweets is made within the control
         if (in_the_mood_to_accept_new_tweets) {
             // add new tweets to the $scope.twitterResult
         }

         // optionally notify other components that new tweets are accepted
         // so that they can adjust or whatever
         $('body').trigger('afterNewTweetsArrived');
    }

}

// you add new tweets by triggering global custom event
$(function(){
    $('#addItem').click(function(){
       $('body').trigger('newTweetsArrived', { ...here_are_the_tweets... });
    });
});
于 2012-11-07T23:15:02.623 回答
-1

你可能会做这样的事情,但我不确定这是否是最好的主意:

var myTwitterScope;
angular.module('Twitter', ['ngResource'])

function TwitterCtrl($scope, $resource){
    $scope.twitter = $resource('http://search.twitter.com/:action',
    {action: 'search.json', q: 'obama', callback:'JSON_CALLBACK'},
    {get:{method:'JSONP'}});
    $scope.doSearch = function(){
        myTwitterScope = $scope;
        $scope.twitterResult = $scope.twitter.get();
    }
}

$(function(){
    $('#addItem').click(function(){
        // add a row to $scope.twitterResult
        myTwitterScope.twitterResult.push(...); // or however you would do this.
    });
});

正如其他人所提到的,这不是最干净的解决方案。

于 2012-11-07T23:01:27.013 回答