2014-09-19 14 views
1

所以我試圖用mootools來創建一個拖放車,如下所示:demo。我可以得到代碼工作得很好,但是當我嘗試編輯他們的html看起來像html beloe時,它停止工作。 CSS仍然適用於人們所期望的,ng-repeat之外的div工作正常。不過,我敢肯定,mootools javascript中的.addEvent無法在ng-repeat內找到.item,所以我無法抓住ng-repeat中的任何.item。Mootools .addEvent無法進入ng-repeat?

任何想法?

更新: 好的,看來問題涉及JavaScript中的domready事件。發生火災時,angularjs尚未加載。我嘗試了加載事件,但這也在angularjs加載之前觸發。任何其他的事件的想法?我現在正在使用mousedown,但這意味着您必須先點擊其中一個圖像,然後才能開始拖動它們,這不是最佳選擇。另外,mousedown事件似乎會導致奇怪的重複出現在購物車中,所以我需要找到一個更好的方法。

<div id="items"> 
    <div class="item"> 
     <p>test</p> 
    </div> 
    <div ng-repeat="post in posts"> 

    <div class="item"> 
     <img class="picImage" src="/static/imgs/{{post.picture}}" alt="Smiley face" height="128" width="128"> 
     <p>Shirt 1</p> 
    </div> 
    </div> 
</div> 

回答

1

取決於你如何連接的拖拽元素。事情是,在ng-repeat通過$scope.$apply等生命週期呈現應用程序的這部分之前,這些元素將不會在那裏。

// this code is wrong. 
$$('.item').addEvent('mousedown', function(event){ 
    event.stop(); 
... 
}); 

此外,如果集合更改,mootools將不知道添加新的點擊處理程序。

你不希望等待內容改變和重新應用mootools事件,這不是一個好主意。

,你可以使用:https://docs.angularjs.org/api/ng/directive/ngMousedown綁定的事件集合元素,添加$scope.onMouseDown和移動邏輯存在,在內部讓角處理它:

<div ng-repeat="post in posts"> 
    <div class="item" ng-mousedown="onMouseDown($event, post, $index)"> 
     <img class="picImage" src="/static/imgs/{{post.picture}}" alt="Smiley face" height="128" width="128"> 
     <p>Shirt 1</p> 
    </div> 
</div> 

的東西,如

$scope.onMouseDown = function($event, post, $index){ 
    // clone and do stuff 


    // if you want to disable stuff, modify `post` etc, potentially can do $scope.$digest/$apply ... 
}; 

...或者您可以使用事件代表團並像這樣綁定:

$('items').addEvent('mousedown:relay(.items)', function(event){ 

    // ... do normal logic but no access to ng model here. can get dirty 
}); 

只要角度不決定重新渲染div#items事件代表(如上通過中繼)將正常工作,由於任何呈現您的應用程序的一部分。如果是這樣,它會破壞保存的事件。這也意味着你需要首先能夠看到這個元素,通過mootools綁定到它。

您可能希望將事件綁定到NG-應用DIV是安全的,並委託給此方法:

document.getElement('[ng-app]').addEvent('mousedown:relay(#items div.items)', fn);