2013-03-24 19 views
0

爲試圖端口一個相當大/複雜的現有應用程序的灰燼世界,我生成的一部分,編譯名爲把手動態模板和關聯與他們的看法,使用該技術:Emberjs - 無法重新定義命名,明確編譯把手模板

var template = Ember.Handlebars.compile("some handlebars stuff"); 
Ember.TEMPLATES["myTemplate"] = template; 

var view = Ember.View.create({ 
    templateName: "myTemplate" 
}); 

一個我想要做的事情是可以重新編譯新的/不同的把手模板標記會覆蓋名爲「MyTemplate的」模板,並已將其是在意見這個名字訪問。

我越來越想這樣做意想不到的結果 - 一對夫婦小提琴那說明問題:

​​- 顯示如果您呈現視圖的命名模板內容已更改後等待會發生什麼。

Second fiddle - 顯示如果有渲染視圖的命名模板的內容已經改變前後沒有延遲會發生什麼。

有很明顯的是,我不理解某些引擎蓋下的魔力。任何人都可以對此有所瞭解嗎?

UPDATE:

我通過了Ember.View和容器模塊的源代碼去了,才明白,我可以通過重寫計算財產在「模板」的第一小提琴解決問題這是一種跳過容器高速緩存查找的方式。我已經提出了另一個fiddle here來演示我找到的解決方案。

這似乎正在按照我希望的方式工作 - 但是 - 感覺就像我可能正在與框架戰鬥,並從容器中「解脫」,以後可能會咬我的方式。有沒有更好的,更多的Ember風格的方式來完成我想要做的事情?我會發現破解的東西嗎?

更新2

我還發現,它也可以在第一小提琴附加視圖2之前只需撥打

view2.get('container').reset(); 

。看起來更清潔/更安全,但它是「合法的」?我更新了First fiddle來說明這一點。

回答

0

我要調用此人接聽。正如我在我的第二個評論中提及,我用在我的項目this fiddle所示的解決方案,沿着這些路線:

mYiew.get('container').reset(); 

有關於未打算用作這裏的API的容器一些討論:https://github.com/emberjs/ember.js/commit/5becdc4467573f80a5c5dbb51d97c6b9239714a8 ,但似乎沒有提及使用視圖中的容器作爲其他用例。另外,一個View的容器可以直接訪問(在「.container」) - 這意味着開發人員並沒有讓他們很難「達到他們對應用程序的」.__容器__「的方式。這可能表明他們打算如何使用它。

由於視圖有能力清除其緩存,只要它想在我看來不是不合理或不好的做法,我使用上述解決方案...至少直到有人讓我直接有一個更好的主意(或緩存API)。

0

(第二小提琴,兩個視圖顯示了第二個模板)

這是因爲view1.appendTo($("#target"));只是安排追加,實際視圖呈現不會發生,直到運行循環的結束。在這之前,你已經設置Ember.TEMPLATES["myTemplate"] = template2;

(第一小提琴,兩個視圖顯示第一個模板)

很肯定這是因爲燼容器緩存模板FX,但不是100%對。檢查中...

+0

@MikeGrassoti謝謝你,你的第一部分回答(關於第二個小提琴)對我來說非常有意義......雖然我對Ember很新,而運行循環對我來說仍然是一個神祕的東西。我試圖解決的真正問題涉及到第一個小提琴 - 儘管我已經開始意識到視圖從諸如調用container.lookup('模板')之類的東西獲得了他們的模板,但我還是無法瞭解容器如何管理數據,以及緩存規則可能是什麼。任何進一步的幫助將會非常棒。再次感謝。 – stephenrs 2013-03-25 05:35:55

+0

容器不是公共API的一部分,但如果它幫助你通過'App .__ container__'可以看到js控制檯中發生了什麼,容器的源代碼在這裏:https://github.com/emberjs/ember。 js/blob/master/packages/container/lib/main.js - 還有更多關於運行循環的詳細信息:http://machty.github.com/blog/2013/01/12/everything-you-never-wanted要了解這個花的運行循環/ – 2013-03-25 06:53:52

+0

再次感謝邁克。通過閱讀源代碼,我能夠清楚地看到發生了什麼事情(請參閱我的更新)。我只是還不確定這種事情的推薦做法是什麼......我認爲這是伴隨着流血邊緣的領域而來的。另外,我讀到與App.container交互作爲一個公共API來訪問全局範圍是不推薦的,但我還沒有看到有關View.container的任何內容...並讓視圖清除自己的緩存似乎是個好主意我,所以我正在使用第二個更新解決方案。希望有人會以一些洞見加入。 – stephenrs 2013-03-25 19:18:51